首页 文章

NodeJS计划支持导入/导出es6(es2015)模块

提问于
浏览
244

我一直在寻找互联网上没有明确的答案 .

目前NodeJS仅使用CommonJS语法来加载模块,如果您真的想使用标准的ES2015模块语法,您必须事先将其转换为或在运行时使用外部模块加载器 .

目前我不太喜欢使用这两种方法中的任何一种,NodeJS维护者是否计划支持ES2015模块?我还没有找到关于此的暗示 .

目前NodeJS 6.x声称支持96%的ES2015功能,但没有任何模块参考(NodeJS ES2105 support link) .

你知道NodeJS是否会在不久的将来支持这些模块?

1 回答

  • 271

    Update 13 September 2017

    NodeJS 8.5.0已发布,支持标志后面的mjs文件:

    node --experimental-modules index.mjs
    

    计划是删除v10.0 LTS版本的标志 .

    Update 8 September 2017

    NodeJS主分支已更新,初始支持ESM模块:
    https://github.com/nodejs/node/commit/c8a389e19f172edbada83f59944cad7cc802d9d5

    这应该是最新的每晚(可以installed via nvm与您现有的安装一起运行):
    https://nodejs.org/download/nightly/

    并在 --experimental-modules 标志后面启用:

    package.json

    {
      "name": "testing-mjs",
      "version": "1.0.0",
      "description": "",
      "main": "index.mjs" <-- Set this to be an mjs file
    }
    

    然后运行:

    node --experimental-modules .
    
    • 过时的信息 . 为了历史目的而留在这里 -

    Update February 2017:

    https://medium.com/@jasnell/an-update-on-es6-modules-in-node-js-42c958b890c#.6ye7mtn37

    NodeJS的人已经确定最不好的解决方案是使用 .mjs 文件扩展名 . 从中得到的结论是:

    换句话说,给定两个文件foo.js和bar.mjs,使用import * from'foo'会将foo.js视为CommonJS,而import * from'bar'会将bar.mjs视为ES6模块

    至于时间表......

    在当前时间点,在Node.js甚至可以开始构建可支持的ES6模块实现之前,仍然需要在ES6和虚拟机方面发生许多规范和实现问题 . 工作正在进行中,但需要一些时间 - 我们目前至少要看一年左右 .

    Update October 2016:

    Node.JS上的一位开发人员最近参加了TC-39 Session 并撰写了一篇关于阻截者的精彩文章,以实现Node.JS:

    https://hackernoon.com/node-js-tc-39-and-modules-a1118aecf95e

    从中得出的基本结论是:

    • ES模块进行静态分析,评估CommonJS

    • CommonJS模块允许猴子修补导出,ES模块目前不允许

    • 很难在没有某种形式的用户输入的情况下检测什么是ES模块以及什么是CommonJS,但他们正在尝试 .

    • *.mjs 似乎是最可能的解决方案,除非他们能够在没有用户输入的情况下准确检测ES模块

    • 原始答案 -

    这已经是相当长一段时间的烫手山芋 . 最重要的是,Node最终将支持用于导入/导出模块的ES2015语法 - 最有可能在spec for loading modules最终确定并达成一致时 .

    这是持有NodeJS的a good overview . 本质上,他们需要确保新规范适用于Node,主要是条件,同步加载以及主要是异步的HTML .

    目前没有人确切知道,但我想Node除了动态加载的新 System.import 之外还支持静态加载 import/export ,同时仍保留遗留代码的 require .

    以下是有关Node如何实现此目标的一些建议:

相关问题