【问题标题】:Requiring normal javascript file from node compiled script?需要来自节点编译脚本的普通 javascript 文件?
【发布时间】:2018-09-22 08:34:31
【问题描述】:

首先,我想声明我对任何与节点有关的事情都很陌生... 在我陈述我的问题之前,这里有一些示例代码可供参考。

test.js

//test.js
const myMessage = 'Bananas';
export default myMessage; // Im not to sure about this line (problem)

main.js

//main.js
const test = require('./test.js');
console.log(test.myMessage);

我想从名为main.js 的节点编译脚本中要求一个名为test.js 的普通外部javascript 脚本。我只需在终端中输入node main.js 就编译了main.js。但是节点吐出一个错误“意外的令牌导出”。我知道我在这里做错了什么。我使用“模块”吗?如何排除导出语句?

感谢您的阅读,如果我的问题让人们对这个问题看起来多么愚蠢而感到震惊,那么抱歉。

【问题讨论】:

  • 节点编译脚本”是什么意思?
  • 无论如何,它应该是export const myMessage = '…';,而不是默认导出,如果你想通过.myMessage访问它。

标签: javascript node.js node-modules


【解决方案1】:

我认为您需要的外部文件是 esModule。除非您将它们转换为 commonJSModule,否则不能直接要求此类文件。您有两种解决方案。

  • 使用 babel 将 esModule 转换为 commonJSModule。 (或在 test.js 中将 export 更改为 module.exports)
  • 如果您使用新的节点版本,您可以将其扩展名更改为 .mjs(将 test.js 重命名为 test.mjs)

请查看这篇应该有帮助的 Medium 文章。

https://medium.com/@giltayar/native-es-modules-in-nodejs-status-and-future-directions-part-i-ee5ea3001f71

【讨论】:

    【解决方案2】:

    Nodejs 尚不支持 export 语法(它是 alpha 版本),而是 Nodejs 提供了一个全局对象* (module.exports),这是您通过 require() 调用返回的内容,所以您只需必须将该对象属性设置为您要导出的内容:

     const myMessage = 'Bananas';
     module.exports.myMessage = myMessage;
    

    或更短:

     exports.myMessage = 'Bananas';
    

    *global 在“虽然你没有定义它但它存在”的意义上,实际上对于每个被执行的脚本,都会创建一个新的module 对象,该对象只能在该脚本内部访问。

    【讨论】:

    • module.exports.myMessage = 'Bananas';?
    【解决方案3】:

    使用 babel 寄存器:https://babeljs.io/docs/en/babel-register

    npm install @babel/core @babel/register @babel/preset-env --save
    

    并且在你的 main.js 中需要它:

    require('@babel/register')({
      presets: [
        [
          '@babel/preset-env',
          {
            targets: {
              node: true
            }
          }
        ]
      ],
      ignore: [
        /node_modules/
      ]
    });
    

    这将通过 babel 解析其他不在 node_modules 中的所需文件,因此 ES6 导入/导出将起作用,并且它还将填充当前版本的节点中不存在的功能(节点:true)。

    请注意,仅当您必须需要无法合理修改的前端脚本时才应使用此选项。解析每一个需求是重量级的,所以如果你必须这样做,尽可能严格地使ignore (或者更好地使用only 选项),这样你就只解析你需要的东西。

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多