NodeJS ES6模块和“默认”导出/导入

时间:2020-04-15 16:54:59

标签: javascript node.js webpack babeljs es6-modules

我正在尝试将ES6样式模块与NodeJS v13.13一起使用,并且遇到了冲突的行为。

最初,我的项目是使用node-babel进行转译的,但是后来我通过向我的package.json文件中添加"type": "module"来启用了内置的ES6模块支持。

这时,诸如import * as esprima from 'esprima';之类的导入语句停止正常工作。经过检查,不是创建函数esprima.parse的导入,而是创建函数esprima.default.parse

当然,所有这些都可以通过以下方式解决:

import * as esprimaLoad from 'esprima';
const esprima = esprimaLoad.default;

但是,根据规范,什么行为是正确的? babel是否有权剥离/折叠默认对象,并且当前的node.js行为中是否存在仍被标记为实验性的错误?所有这些ES模块与CommonJS模块的东西都让我头疼。

更新

我还没有深入了解这个问题,但是涉及的更多。 esprima.js,这是一个有问题的库之一,似乎是使用webpack创建的,并且是UMD(通用模块定义)格式。它从以下内容开始:

(function webpackUniversalModuleDefinition(root, factory) {
/* istanbul ignore next */
    if(typeof exports === 'object' && typeof module === 'object')
        module.exports = factory();
    else if(typeof define === 'function' && define.amd)
        define([], factory);
/* istanbul ignore next */
    else if(typeof exports === 'object')
        exports["esprima"] = factory();
    else
        root["esprima"] = factory();
})(this, function() { ...

我认为webpack UMD格式已经可以与浏览器中的import语句以及node.js中的require语句一起使用。但是,当在node.js中使用实验性模块/ babel时,以下内容似乎根本不起作用:

import esprima from 'esprima'

以下内容适用于babel,但不适用于实验模块:

import * as esprima from 'esprima'

并且以下内容可与babel和实验模块一起使用:

import * as esprimaLoad from 'esprima'
const esprima = esprimaLoad.default?esprimaLoad.default:esprimaLoad;

对于不使用Webpack UMD技巧的模块,babel和实验性模块似乎都可以正常工作。

1 个答案:

答案 0 :(得分:1)

如果您要导出default,则不需要以这种环形方式导入它。

最简单的版本直接导入默认值:

import myDefault from '/modules/my-module.js';

还可以将默认语法与上面看到的语法一起使用 (命名空间导入或命名导入)。在这种情况下,默认 必须首先声明导入。例如:

import myDefault, * as myModule from '/modules/my-module.js';
// myModule used as a namespace

您可以从MDN

查看更多信息

所以就您而言

import esprima from 'esprima';

这应该是最简单的导入语句。