CommonJS模块的同构导入

时间:2018-01-13 18:08:39

标签: node.js typescript webpack es6-modules

我写了一个小型库,可以在浏览器和服务器上运行。该库依次使用作为CommonJS模块发布的npm库(例如lodash.isequal)。

我想以两种不同的方式编译库:

  1. 使用tsc生成commonjs模块以在服务器上使用
  2. 通过webpack,使用awesome-typescript-loader,为webpack生成es6模块进行捆绑
  3. 根据docs,导入覆盖module.exports的CommonJS库的正确方法如下:

    import isEqual = require('lodash.isequal');
    

    然而,对于第二个编译案例,typescript抱怨

      

    错误TS1202:定位ECMAScript模块时无法使用导入分配。考虑使用'import * as ns from“mod”','import {a} from“mod”','import d from“mod”'或其他模块格式。

    通过将其导入为:

    ,我设法让代码生成正常工作
    import * as isEqual from 'lodash.isequal';
    

    但这需要禁用类型检查,因为否则打字机会出现如下错误:

      

    错误TS2497:模块'“/ home / users / tt-mod-test / node_modules / @ type / lodash.isequal / index”'解析为非模块实体,无法使用此结构导入。

1 个答案:

答案 0 :(得分:0)

从TypeScript 2.7开始,可以使用合成默认导入来解决此问题。使用esModuleInterop标志,可以像babel和webpack一样导入isEqual(和类似的模块):

import isEqual from 'lodash.isequal';

对于module选项设置为es6的webpack,导入将保持原样,webpack本身将处理合成默认值。对于节点,module设置为CommonJS,相应的发射将为const lodash_isequal_1 = __importDefault(require("lodash.isequal"));,其中__importDefault处理像Babel

这样的非es模块情况