【问题标题】:Unexpected token 'export' while importing dynamically a js file动态导入 js 文件时出现意外的令牌“导出”
【发布时间】:2020-07-31 09:07:42
【问题描述】:

我正在创建一个脚本,它将在我的系统中运行某些 js 文件(在我的项目之外,实际上它们是 React 应用程序中的纯 js 文件),我想评估它们的内容并获取变量的内容在我的脚本中使用它们。看这里的代码:

import glob from 'glob';

const cwd = '/path/to/code';
const findAll = () => glob('**/*config.js', { cwd }, (err, matches) => {
// matches is an array of paths like ['dir/myfile-config.js']
  if (err) {
    console.error(err);
    return;
  }
  const file = matches[0];
  // file here is the path to a JS file that contains something like export const CONFIG = {prop1: 'value1'};
  import(`${cwd}/${file}`)
    .then(console.log)
    .catch(console.error);
});

当我调用 import() 函数时,它抱怨:

export const CONFIG = {
^^^^^^

SyntaxError: Unexpected token 'export'

但是它正在正确导入“glob”库。我不明白为什么它无法导入该文件,也无法在互联网上找到任何有关它的信息。我可以找到有关如何使节点理解模块系统的信息,但这不是问题,因为我的程序理解导入/导出 sintaxis。 我正在使用节点 12.13.0 运行我的程序,运行文件如下:

node --experimental-modules ./index.js

我也尝试使用节点 13.14.0(删除 --experimental-modules 标志)并得到相同的结果:(

任何帮助将不胜感激。

我还添加了我正在使用的 package.json:

{
  "name": "config-retriever",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "license": "MIT",
  "type": "module",
  "private": true,
  "dependencies": {
    "glob": "^7.1.6"
  }
}

【问题讨论】:

  • 您好 T.J,感谢您的回复,我已添加包 json。我要导入的文件在这个项目之外,它只是反应应用程序中的一个普通 js 文件,它不在模块或类似的东西中,我的猜测(对内部如何工作的零知识)是问题可能会朝着这个方向发展。

标签: javascript node.js import


【解决方案1】:

问题在于,默认情况下,Node.js 通过使用其关闭 package.json 来确定某个东西是 CJS 模块还是 ESM 模块。你说过这些配置在项目之外,所以没有package.json 告诉 Node.js 将它们视为 ESM 而不是 CJS。

选项:

  1. package.json 添加到配置所在的位置,其中包含"type": "module"。从字面上看,就是这样:

    {
        "type": "module"
    }
    
  2. 您可以通过为配置文件提供扩展名 .mjs 来强制执行此操作,该扩展名始终被视为 ESM 模块(并相应地更改您的 glob 调用)。对我来说,这不是一个很好的解决方案,但是......

  3. 也可以使用getFormat hook 告诉 Node 这些配置文件是 ESM,而不是 CJS。但是,关于它的注释说它正在重新设计中,你不应该依赖它。

【讨论】:

  • 解决方案 1 完美运行,非常感谢 T.J.!解决方案 2 不是一个选项,因为我想要阅读的那些文件是生产代码,我不想弄乱它。考虑到您刚才提到的免责声明,我还将探讨选项 3。现在我想我会动态地将“类型”:“模块”添加到包 json 中,并在脚本完成后将其删除,这样我就不会污染应用程序的包 json。再次感谢您的超快回复:)祝您有美好的一天!
  • @A.Llorente - 啊,我喜欢那种充满活力的东西! :-) 编码愉快!
【解决方案2】:

如果你想在一个js文件中运行一个特定的函数,你应该使用Make-Runnable模块。

把这段代码sn-p放在你的js文件末尾。

require('make-runnable/custom')({
  // printOutputFrame: false
});

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2020-12-30
    • 2017-12-04
    • 2018-03-31
    • 2018-03-16
    • 2021-06-22
    • 2017-06-22
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多