我正在使用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" />
我读过很多东西,说你可以做一个导入的路径,但这仍然不是为我工作。任何帮助都将不胜感激。我知道有很多这样的问题,但他们都告诉我导入标志或形象,所以很明显,我在大局中遗漏了一些东西。
这对我来说很有效,不需要安装/更改任何东西
上下文:当我试图使用yarn运行构建生成一个构建时,我得到了这个错误
我所做的事情之间的工作和失败的纱线运行建立
我将ant设计更新到最新的稳定版本(v4.23.5)。
注:我非常相信这与这个版本无关。我提一下只是为了补充一些细节。
这个回答解决了我的问题。但是我没有更改任何访问src目录之外内容的导入。
更改包括更新的包。json,纱线。lock,新的Antd实现(主要是道具的变化)。
为什么构建命令坏了/为什么答案是工作的没有意义。
解决办法
因为所有的变化都与包装有关。json, yarn.lock。我删除了node_modules并清洁安装了所有的包。
Run
yarn
or
npm install
如果你的文件位于公共文件夹,如果你想导入它而不弹出或不使用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”。因此,使用这种模式,您可以访问位于公共文件夹中的资产。
下面是一个在简单情况下工作得很好的替代方案(使用fs和ncp)。在开发过程中,保持一个脚本运行,以监视/src之外的共享文件夹的更改。当进行更改时,脚本可以自动将共享文件夹复制到项目中。下面是递归地查看单个目录的示例:
// This should be run from the root of your project
const fs = require('fs')
const ncp = require('ncp').ncp;
ncp.limit = 16
// Watch for file changes to your shared directory outside of /src
fs.watch('../shared', { recursive: true }, (eventType, filename) => {
console.log(`${eventType}: ${filename}`)
// Copy the shared folder straight to your project /src
// You could be smarter here and only copy the changed file
ncp('../shared', './src/shared', function(err) {
if (err) {
return console.error(err);
}
console.log('finished syncing!');
});
})
再加上Bartek Maciejiczek的回答,下面是Craco的情况:
const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
const path = require("path");
module.exports = {
webpack: {
configure: webpackConfig => {
webpackConfig.resolve.plugins.forEach(plugin => {
if (plugin instanceof ModuleScopePlugin) {
plugin.allowedFiles.add(path.resolve("./config.json"));
}
});
return webpackConfig;
}
}
};
我之前的解决方案适用于Webpack 4,但不适用于Webpack 5。在浏览了从那时起积累的解决方法之后,我发现下面的方法非常简单(而且似乎是可扩展的)。
import { CracoAliasPlugin } from 'react-app-alias';
const cracoConfig = {
plugins: [
{
plugin: CracoAliasPlugin,
options: {
alias: { '~': './' },
},
},
],
}
然后像这样导入:
import whatever from '~/<path-to-file>';
react-app-rewired包可以用来删除插件。这样你就不用弹射了。
按照npm包页面上的步骤(安装包并翻转包中的调用)。Json文件),并使用类似于这个的config-override .js文件:
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
module.exports = function override(config, env) {
config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin));
return config;
};
这将从使用的WebPack插件中删除ModuleScopePlugin,但保留其余部分,并消除了弹出的必要性。