是否需要从节点编译脚本中获取正常的javascript文件?

时间:2018-09-22 08:34:31

标签: javascript node.js node-modules

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

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);

我想从一个名为test.js的节点编译脚本中获取一个名为main.js的普通外部javascript脚本。我只需在终端中输入main.js即可编译node main.js。但是节点吐出一个错误“意外的令牌导出”。我知道我在这里做错了。我是否使用“模块”?如何排除出口声明?

感谢您的阅读,如果我的问题使人们对这个问题看起来有多愚蠢,则表示抱歉。

3 个答案:

答案 0 :(得分:4)

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

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

请查看这篇对您有帮助的中型文章。

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

答案 1 :(得分:1)

Nodejs(在Alpha版本中)尚不支持export语法,而是Nodejs提供了一个全局对象*(module.exports),这是您从{{1}中学到的}调用,因此您只需要将该对象属性设置为要导出的对象即可:

require()

或更短:

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

* global的意思是“尽管没有定义,它仍然存在”,实际上对于每个执行的脚本,都会创建一个新的 exports.myMessage = 'Bananas'; 对象,该对象只能在该脚本内部访问。

答案 2 :(得分:1)

使用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导入/导出将起作用,并且还将填充您当前版本的节点(node:true)中不存在的polyfill功能。

请注意,仅当您需要无法合理修改的前端脚本时,才应使用此选项。解析每个需求非常重要,因此如果需要,请使ignore尽可能严格(甚至最好使用only选项),以便仅解析所需内容。