我处于一种情况,即我们在不同的环境中运行不同版本的Node,并且我希望能够根据正在运行的Node版本有条件地导入某些模块。
我尝试使用以下代码块执行此操作,但会导致错误
“导入”和“导出”可能仅出现在顶层
let ver = process.version.slice(1,ver.length).split('.');
if (parseInt(ver[0]) < 7) {
import 'babel-polyfill'
}
答案 0 :(得分:3)
为此有一个babel预设-https://babeljs.io/docs/en/babel-plugin-syntax-dynamic-import。您可以按以下方式使用它-
let ver = process.version.slice(1,ver.length).split('.');
if (parseInt(ver[0] < 7)) {
import('babel-polyfill')
.then(result => {
console.log(result);
});
}
答案 1 :(得分:1)
有条件的import
仅允许作为动态导入使用,Node.js实验性ES模块支持支持这些条件。动态导入的问题在于它们是异步的。由于应该将polyfill应用于所有应用程序,因此这会将动态导入传播到所有模块导入。即
import 'babel-polyfill';
import * as foo from './foo';
import * as bar from './bar';
...
成为
(async () => {
let ver = process.version.slice(1,ver.length).split('.');
if (parseInt(ver[0]) < 7) {
await import 'babel-polyfill';
}
const foo = await import('./foo');
const bar = await import('./bar');
...
})()
.catch(console.error);
因此在Node.js 非本地 ES模块中使用require
进行条件导入仍然是一个好主意,因为应该将ES模块编译为CommonJS和{{1 }}与Babel:
require
最重要的是,不应有条件地导入polyfill,因为它的目的是为了填充缺少的要素。对于不需要进行多重填充的功能,它没有任何作用。如果let ver = process.version.slice(1,ver.length).split('.');
if (parseInt(ver[0]) < 7) {
require('babel-polyfill');
}
import * as foo from './foo';
import * as bar from './bar';
...
的某些部分尚未使用,但在以后的Node版本中引起问题,则仅导入当前应用程序中需要的部分。 babel-polyfill
只是babel-polyfill
polyfill的包装,它的粒度很细,可以缩小到polyfilling的特定功能。