首页 > 解决方案 > 这种情况的正确语法是什么?

问题描述

我对JS感到困惑。我写了一个 Stack 的伪实现,它保存在自己的文件中。我想在一个单独的文件中“创建”一个 Stack 对象,但是,WebStorm 告诉我一个语法错误。请参阅下面的错误:

import Stack from "./Stack"
       ^^^^^

SyntaxError: Unexpected identifier
    at Module._compile (internal/modules/cjs/loader.js:718:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:785:10)
    at Module.load (internal/modules/cjs/loader.js:641:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:837:10)
    at internal/main/run_main_module.js:17:11

根据其他用户最近的建议,这是我在测试器文件中调用导入的方式:

// Stack.js
class Stack {
    ....
}
export default Stack

// StackTester.js driver file
import Stack from "./Stack"
    ....

标签: javascriptwebstorm

解决方案


请检查您的 node.js 版本。node.js 8.5.0+ 支持该import语法(作为实验性功能)。要使用此功能,您需要:

  1. 如果您使用旧版本的 Node.js,则需要对其进行升级。

    WebStorm 使用的 node.js 解释器可以在Setting-> Language & Frameworks->Node.js and NPM中找到,您可能会根据目录路径找到版本(例如,在我的情况下它是 8.12.0),或者基于类似的命令node -v

    在此处输入图像描述

  2. 将所有*.js文件重命名为*.mjs. 例如重命名stack.jsstack.mjs

  3. 使用命令行参数运行您的mjs文件。--experimental-modules如果你使用命令行,你应该使用类似于node --experimental-modules main.mjs. 如果你使用 webstorm,你可以通过 webstorm 命令行参数来配置它(如截图所示)

    在此处输入图像描述 在此处输入图像描述

但是,import/export语句并不是在 node.js 中进行模块化开发的最佳方式。它主要用在 webpack 的前端 Web 开发中。通常在 node.js 中,我们使用requireand module.export,它应该类似于

// In stack.js
class Stack {

}
module.export = {Stack}

// In main.js
const {Stack} = require('./stack.js')

此外,如果 Webstorm 在编辑器中显示警告消息,您可能需要在 Webstorm 中启用 ES6 语法。

Setting-> Language & Frameworks-> JavaScript,在 的下拉列表中JavaScript Language Version选择ECMAScript 6

在此处输入图像描述


推荐阅读