json
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"noImplicitAny": true,
"moduleResolution": "node",
"removeComments": true,
"sourceMap": false,
"outDir": "./dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
}
},
"include": [
"src"
]
}
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"noImplicitAny": true,
"moduleResolution": "node",
"removeComments": true,
"sourceMap": false,
"outDir": "./dist",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
}
},
"include": [
"src"
]
}
module
组织代码方式target
编译目标平台noImplicitAny
允许隐式的 any 类型removeComments
编译 js 的时候,删除掉注释sourceMap
生成sourcemapoutDir
输出js目录
丢失类型(全部为any)
原因在于const xxx = require('') 导入的写法会导致默认导入为 any 类型
所以有类型声明的库,使用import * as xxx from 或 import xxx from 的写法导入
ts
import * as koa from "koa"
import * as Router from "koa-router"
import * as koa from "koa"
import * as Router from "koa-router"
Object.defineProperty(exports, "__esModule", { value: true });
tsc打包后的js顶部会多一句这个
原因在于:ES 模块和 CommonJS 模块并不完全兼容,CommonJS 的 module.exports 在 ES 模块中没有对应的表达方式,和默认导出 export default 是不一样的
为了解决这个问题,现在市面上的打包器都非常默契地遵守了__esModule 这个解决方案
表面上看就是把一个导出对象标识为一个 ES 模块
总结
综上,__esModule 是用来兼容 ES 模块导入 CommonJS 模块默认导出方案
在以后写 CommonJS 模块的时候尽量不要用 module.exports 导出单对象,而是导出具体的属性名 exports.foo = bar。在 ES 模块中也尽量不要用 export default