我正在尝试将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和实验性模块似乎都可以正常工作。
答案 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';
这应该是最简单的导入语句。