我今天正在学习JavaScript。我在同一目录中创建了两个文件“ a.js”和“ b.js”。
a.js代码
export default class User {
constructor(n) {
this._a = n;
}
}
export function f(n) {
console.log("Funct");
}
b.js代码:
import User, {f} from './a.js';
var u = new User("hey");
console.log(u, u._a);
f();
当我运行 node b.js 时,出现以下错误使我震惊:
(节点:47205)警告:要加载ES模块,请在以下位置设置“ type”:“ module” package.json或使用.mjs扩展名。 / Users / rammurthys / Documents / Angular Tute / JS / b.js:1导入用户{f} 来自'./a.js'; ^^^^^^
SyntaxError:无法在模块外部使用import语句 在wrapSafe(内部/模块/cjs/loader.js:1055:16) 在Module._compile(内部/模块/cjs/loader.js:1103:27) 在Object.Module._extensions..js(内部/模块/cjs/loader.js:1159:10) 在Module.load(internal / modules / cjs / loader.js:988:32) 在Function.Module._load(内部/模块/cjs/loader.js:896:14) 在Function.executeUserEntryPoint [作为runMain](内部/模块/run_main.js:71:12) 在internal / main / run_main_module.js:17:47
如果我运行节点a.js ,则会引发如下错误。
(节点:47321)警告:要加载ES模块,请在以下位置设置“ type”:“ module” package.json或使用.mjs扩展名。 / Users / rammurthys / Documents / Angular Tute / JS / a.js:1导出默认 类用户{^^^^^^
SyntaxError:意外的令牌“导出” 在wrapSafe(内部/模块/cjs/loader.js:1055:16) 在Module._compile(内部/模块/cjs/loader.js:1103:27) 在Object.Module._extensions..js(内部/模块/cjs/loader.js:1159:10) 在Module.load(internal / modules / cjs / loader.js:988:32) 在Function.Module._load(内部/模块/cjs/loader.js:896:14) 在Function.executeUserEntryPoint [作为runMain](内部/模块/run_main.js:71:12) 在internal / main / run_main_module.js:17:47
我正在使用节点v13.5.0。 在VS代码上执行此操作。
请帮助我了解我在想什么。谢谢
答案 0 :(得分:1)
从.js重命名.mjs达到了目的。谢谢@昆汀!
.mjs是除了需要{}之外还可以使用导出和导入javascript的两种方法之一。
详细说明: https://medium.com/passpill-project/files-with-mjs-extension-for-javascript-modules-ced195d7c84a
答案 1 :(得分:1)
重要的是要了解NodeJS不是ES6。您正在尝试做的是ES6规范的一部分。到目前为止,默认情况下,并不是NodeJS中的所有功能都可用,这就是为什么需要.mjs
扩展名的原因。一旦ES6在不久的将来完成所有工作,NodeJS也将能够添加支持。
我不建议使用扩展名.mjs
。最好选择像Babel这样的翻译机。 Babel将ES6代码编译为NodeJS,而无需更改文件扩展名。
类似的信息可以在这里找到:https://medium.com/the-node-js-collection/an-update-on-es6-modules-in-node-js-42c958b890c