如何从react应用程序中的公共文件夹导入文件?

IT技术 javascript reactjs
2021-05-26 18:54:21

我在 public 文件夹中有一个 javascript 文件,我想将该文件导入文件夹 src/components 中的组件。

projectFolder
  publicFolder
    index.html
    recorder.js
  srcFolder
    componentsFolder
       Speech.js
       Speech.css

但是我不能在我的组件中做这样的事情:

import Recorder from '../../public/recorder'

因为我收到以下错误:

未找到module:您试图导入项目 src/ 目录之外的 ../../public/recorder。不支持 src/ 之外的相对导入。您可以将其移动到 src/ 中,也可以从项目的 node_modules/ 中向其添加符号链接。

据我所知,不允许在 /src 目录之外导入,所以我想知道如何“添加符号链接”或者您是否知道其他修复方法。

4个回答

我相信您正在使用 create-react-app ...这是包含在 中的一项功能ModuleScopePlugin,您可以通过弹出应用程序并编辑您的 webpack 配置来禁用它(如本答案所述)。

但请注意,该功能的存在是有原因的。create-react-app 构建工具只处理 src/ 目录,所以例如你在这里之外的 JavaScript 不会被 Babel 转译。此外,如果您使用像 Webpack 这样的打包器,您通常会试图避免污染全局范围。所以除非你有一个非常具体的理由为什么你需要这样做,否则我会说尝试移动它。

您可以react-scripts使用rescripts 库修改配置

.rescriptsrc.js在根文件夹中创建一个名为的文件:

module.exports = config => {
  const scopePluginIndex = config.resolve.plugins.findIndex(
    ({ constructor }) => constructor && constructor.name === "ModuleScopePlugin"
  );

  config.resolve.plugins.splice(scopePluginIndex, 1);

  return config;
};

如果您确定不使用实际文件public并且在src目录中有重复的 js 文件,那么如果您使用 vscode,则有一个很酷但很酷的解决方案。这个 vscode 扩展https://marketplace.visualstudio.com/items?itemName=emeraldwalk.RunOnSave允许你在保存时触发命令(你可以使用正则表达式来指定哪个文件保存应该触发哪些命令),你可以指定一个命令来在保存时运行:

{
    "match": "public\\\\recorder.js$",
    "cmd": "copy ${file} ${workspaceFolder}\\src\\recorder.js"
}

现在您可以从该重复文件导入。

正如我所看到的,您想在子组件中导入父组件。

定义路径 './' 表示您正在工作的当前目录,因此您可以通过跟随 '../' 上一级,上一级目录也是如此。

因此,如果您想从 Speech.js 组件内的公共文件夹导入,您可以执行以下操作。

// 在 Speech.js 中

import Recorder from './../../public/recorder';

希望这对你有用。