Skip to content
索引
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 生成sourcemap
  • outDir 输出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

Released under the MIT License.