我正在使用create-react-app。我试图从我的src/components内部的文件中调用我的公共文件夹中的图像。我收到这个错误信息。

./src/components/website_index.js模块未找到:你试图 import ../../public/images/logo/WC-BlackonWhite.jpg 在项目src/目录之外。国外的相对进口 Src /不支持。您可以将它移动到src/,或者添加一个 从项目的node_modules/到它的符号链接。

从“../../public/images/logo_2016.png”导入logo; <img className="Header-logo" src={logo} alt=" logo" />

我读过很多东西,说你可以做一个导入的路径,但这仍然不是为我工作。任何帮助都将不胜感激。我知道有很多这样的问题,但他们都告诉我导入标志或形象,所以很明显,我在大局中遗漏了一些东西。


当前回答

此限制确保所有文件或模块(导出)都在src/目录中,实现在./node_modules/react-dev-utils/ModuleScopePlugin.js中,在以下代码行中。

// Resolve the issuer from our appSrc and make sure it's one of our files
// Maybe an indexOf === 0 would be better?
     const relative = path.relative(appSrc, request.context.issuer);
// If it's not in src/ or a subdirectory, not our request!
     if (relative.startsWith('../') || relative.startsWith('..\\')) {
        return callback();
      }

您可以通过

修改这段代码(不推荐) 或者执行eject,然后从目录中删除ModuleScopePlugin.js。 const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');从。/ node_modules / react-scripts / config / webpack.config.dev.js

PS:注意弹出的后果。

其他回答

你需要移动WC-BlackonWhite.jpg到你的src目录。public目录是用于直接链接到HTML中的静态文件(如favicon),而不是用于直接导入到bundle中的内容。

安装这两个包

npm i --save-dev react-app-rewired customize-cra

package.json

"scripts": {
    - "start": "react-scripts start"
    + "start": "react-app-rewired start"
},

config-overrides.js

const { removeModuleScopePlugin } = require('customize-cra');

module.exports = function override(config, env) {
    if (!config.plugins) {
        config.plugins = [];
    }
    removeModuleScopePlugin()(config);

    return config;
};

用Craco去除:

module.exports = {
  webpack: {
    configure: webpackConfig => {
      const scopePluginIndex = webpackConfig.resolve.plugins.findIndex(
        ({ constructor }) => constructor && constructor.name === 'ModuleScopePlugin'
      );

      webpackConfig.resolve.plugins.splice(scopePluginIndex, 1);
      return webpackConfig;
    }
  }
};

如果你的文件位于公共文件夹,如果你想导入它而不弹出或不使用react-app-rewired,那么在这种情况下,你可以通过域名和文件的路径访问文件,并使用axios。 示例:在公共文件夹中有一个名为favico.ico的字体文件。你想把它导入到src中的一个文件中。你 可以使用以下逻辑访问字体。

axios.get('example.com/favico.ico').then(() => {
  // here you can access this file.
})

在上面的例子中,example.com是域名。如果您有不同的环境,如本地主机,登台,生产,那么在这种情况下,域名是不同的。 因此,要获得favico.ico,您可以使用以下逻辑。

axios.get(`${window.location.origin}/favico.ico`).then(() => {
  // here you can access this file.
})

在上面的例子中,window.location.origin会给你当前的域,如果你在本地运行你的代码,它会给你http://localhost:{portnumber}, 如果您的代码运行在生产域中,并且生产域是example.com,那么它将为您提供“example.com”。因此,使用这种模式,您可以访问位于公共文件夹中的资产。

这是一个相对导入的问题,这可能是因为我们使用了“create-react-app project”命令,该命令形成了一个名为project的目录,其中包含node_modules文件夹和其中的public和src文件夹中的其他几个文件。 create-react-app命令设置了一个限制,我们不能从src外部导入任何东西。

我的问题:

我必须导入在src文件夹外的node_modules文件夹中创建的react-bootstrap css文件。 我使用导入“../node_modules/bootstrap/dist/css/bootstrap.min.css”;但是我在终端上得到了错误。 我发现我可以创建一个新的react应用程序,并遵循从a到G的解决步骤,以解决这个问题。

解决方案: A)创建一个新的react应用,使用Create -react-app new

B) cd new

C)运行以下命令:"npm install react-bootstrap bootstrap@4.6.0"(不带""双引号)

D)在你的react文件中导入bootstrap: D.1)导入“../node_modules/bootstrap/dist/css/bootstrap.min.css”; 或 D.2)从“react-bootstrap/Button”导入按钮;

E)在你的react文件中创建一个类似Button或任何东西的引导元素,用于D.1) < Button className="btn btn-success" >引导< / Button > 或 2) <按钮变量="primary"> Bootstrap < /按钮>

F)在终端:cd src

G)在终端:npm启动,

这一次它将被成功编译。

推理: 当我按顺序执行步骤A到G时,我可以看到react-bootstrap终于开始工作了,这一次我没有得到任何错误。 (我想到这个解决方案是因为:

我已经使用npm安装“@material-ui/icons”,它被安装在src之外的node_modules文件夹中。 在我的react文件中,我使用了import Add from“@material-ui/icons/Add” 材质界面图标对我来说工作得很好, 但这里我们也从src外部导入,从node_modules..一切都很正常。为什么这次从src外部导入没有错误) 这就是为什么我刚刚创建了一个新的react应用程序,并遵循解决方案步骤a到G。