代码之家  ›  专栏  ›  技术社区  ›  bigtunacan

根据节点版本有条件导入节点模块

  •  3
  • bigtunacan  · 技术社区  · 7 年前

    我正处于这样一种情况:我们有不同的环境运行不同版本的节点,我希望能够根据正在运行的节点的版本有条件地导入某些模块。

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

    “import”和“export”只能出现在顶层

    let ver = process.version.slice(1,ver.length).split('.');
    if (parseInt(ver[0]) < 7) {
      import 'babel-polyfill'
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Estus Flask    7 年前

    有条件的 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);
    

    所以还是个好主意 require 对于node.js中的条件导入 非本土的 ES模块,因为ES模块应该传播到commonjs和 要求 与Babel:

    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';
    ...
    

    最重要的是, polyfill不应该有条件地导入,因为它的目的是为了polyfill缺少的特性 . 它与不需要多填充的功能没有任何关系。如果 babel-polyfill 未使用,但在较新的节点版本中会导致问题,请仅导入当前应用程序所需的部件。 巴别塔填料 只是包装纸 core-js 聚填料,是一种细颗粒,可以缩小到聚填料的具体特点。

        2
  •  3
  •   Rishikesh Dhokare    7 年前

    这个有一个巴别塔预设- 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);
        });
    }
    
    推荐文章