根据节点版本

时间:2018-08-07 14:05:29

标签: node.js

我处于一种情况,即我们在不同的环境中运行不同版本的Node,并且我希望能够根据正在运行的Node版本有条件地导入某些模块。

我尝试使用以下代码块执行此操作,但会导致错误

  

“导入”和“导出”可能仅出现在顶层

let ver = process.version.slice(1,ver.length).split('.');
if (parseInt(ver[0]) < 7) {
  import 'babel-polyfill'
}

2 个答案:

答案 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的特定功能。