赞
踩
esModuleInterop
选项的作用是支持使用import d from 'cjs'
的方式引入commonjs
包。
如果一个模块没有类型声明,可以直接使用const cjs = require('cjs')
的方式引入模块,此时cjs的类型是any
1.使用import cjs = require('cjs')
方法引入
2.使用import * as cjs from 'cjs'
方法引入,此时cjs
相当于exports
变量(虽然这能够正常工作,但其实不符合es模块规范,es模块规范规定cjs这个命名空间只能是一个纯对象,但是不能够直接调用,以koa举例)
import * as Koa from 'koa';
// 不符合规范
const app = new Koa();
// 编译后的结果
const Koa = require("koa");
const app = new Koa();
那怎么才能使用import cjs from 'cjs'
语法呢?
首先你需要去除类型检查(允许从没有设置默认导出的模块中默认导入
),这可以使用allowSyntheticDefaultImports
配置项帮你达到。
其次你的导出需要有default
属性,因为allowSyntheticDefaultImports
只是帮你去掉类型检查,但是并不会影响编译后的代码输出,假设没有default
属性,虽然可以正常编译,但是在运行时还是会报错的,这就需要esModuleInterop
配置帮你完成了,因为对于大对数模块而言,并没有default属性。
提供两个helper函数__importStar
和__importDefault
分别处理import * as
和import default
。
例如对于下面的代码:
import * as foo from "foo";
import b from "bar";
编译后的结果:
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
}
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
}
exports.__esModule = true;
var foo = __importStar(require("foo"));
var bar_1 = __importDefault(require("bar"));
可以看到会主动帮你设置default
属性
开启esModuleInterop
后会默认开启allowSyntheticDefaultImports
选项
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。