【问题标题】:Export-import in JavaScript --- SyntaxError: Cannot use import statement outside a moduleJavaScript 中的导出-导入 --- SyntaxError: 不能在模块外使用导入语句
【发布时间】:2020-07-18 13:00:57
【问题描述】:

我今天正在学习 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 时,出现如下错误:

(node:47205) 警告:要加载 ES 模块,请设置 "type": "module" in package.json 或使用 .mjs 扩展名。 /Users/rammurthys/Documents/Angular Tute/JS/b.js:1 导入用户,{f} 来自'./a.js'; ^^^^^^

SyntaxError: 不能在模块外使用 import 语句 在 wrapSafe (internal/modules/cjs/loader.js:1055:16) 在 Module._compile (internal/modules/cjs/loader.js:1103:27) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1159:10) 在 Module.load (internal/modules/cjs/loader.js:988:32) 在 Function.Module._load (internal/modules/cjs/loader.js:896:14) 在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) 在 internal/main/run_main_module.js:17:47

如果我运行 node a.js,它会抛出如下错误。

(node:47321) 警告:要加载 ES 模块,请设置 "type": "module" in package.json 或使用 .mjs 扩展名。 /Users/rammurthys/Documents/Angular Tute/JS/a.js:1 导出默认值 类用户{ ^^^^^^

SyntaxError: 意外标记“导出” 在 wrapSafe (internal/modules/cjs/loader.js:1055:16) 在 Module._compile (internal/modules/cjs/loader.js:1103:27) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:1159:10) 在 Module.load (internal/modules/cjs/loader.js:988:32) 在 Function.Module._load (internal/modules/cjs/loader.js:896:14) 在 Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12) 在 internal/main/run_main_module.js:17:47

我正在使用节点 v13.5.0。 在 VS 代码上执行此操作。

请帮助我了解我缺少什么。谢谢

【问题讨论】:

  • 错误消息的第一行告诉您可以做两件事来解决这个问题。你试过了吗?
  • 我们是否需要 package.json 只是为了简单地执行一个 JS 文件?
  • 错误信息的第一行告诉你件你可以做的事情来解决这个问题。如果你不喜欢一个,那就试试另一个。
  • 哦,是的,使用 .mjs 重命名有效!谢谢 。我知道为什么需要这样做。

标签: javascript node.js


【解决方案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

【讨论】:

    【解决方案2】:

    从 .js 重命名 .mjs 就成功了。谢谢@昆汀!

    .mjs 是除了 require {} 之外的两种玩转导出-导入 javascript 的方法之一。

    详细解释: https://medium.com/passpill-project/files-with-mjs-extension-for-javascript-modules-ced195d7c84a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2023-02-08
      • 2021-03-08
      • 2021-10-25
      • 2021-12-28
      • 2021-10-02
      • 2022-01-14
      相关资源
      最近更新 更多