1.相关配置

配置名称 含义
module 设置编译结果中使用的模块化标准
moduleResolution 设置解析模块的模式
noImplicitUseStrict 编译结果中不包含”use strict”
removeComments 编译结果中移除注释
onEmitOnError 错误时不生成编译结果
esModuleInterop 启用es模块化交互非es模块导出

2.前端领域中的模块化标准

TS中,导入和导出模块,统一使用ES6的模块化标准。

注意:导入模块时,不要添加后缀名ts,因为导入导出代码会进行编译的,导致编译时找不到文件。

3.编译结果中的模块化

可配置 tsconfig.json 文件

  1. {
  2. "module": "commonjs",
  3. "module": "es6", // 编译前和编译后无变化
  4. "removeComments" : true, // 编译结果中移除注释
  5. "esModuleInterop": true, // 启用es模块化交互非es模块导出
  6. }

导入编译前:

  1. import { name, sum } from './myModule'
  2. import obj from "./myModule"
  3. console.log(name);
  4. console.log(sum(3, 5));
  5. console.log(obj);
  6. console.log(obj.name);

导入编译后:

  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const myModule_1 = require("./myModule");
  7. const myModule_2 = __importDefault(require("./myModule"));
  8. console.log(myModule_1.name);
  9. console.log((0, myModule_1.sum)(3, 5));
  10. console.log(myModule_2.default);
  11. console.log(myModule_2.default.name);

导出编译前:

  1. export const name: string = "kevin"
  2. export function sum(a: number, b: number): number {
  3. return a + b;
  4. }
  5. export default {
  6. name: "zhangsan",
  7. age: 23
  8. }

导出编译后:

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.sum = exports.name = void 0;
  4. exports.name = "kevin";
  5. function sum(a, b) {
  6. return a + b;
  7. }
  8. exports.sum = sum;
  9. exports.default = {
  10. name: "zhangsan",
  11. age: 23
  12. };

4.解决默认导入的错误

在导入node内置模块时,比如 import fs from "fs"

由于 fs 是node内置模块,故它导出的是module.export对象,而不是默认导出。

因此用ES6模块化默认导出( import fs from "fs")时会报错。

解决办法1:

  1. import * as fs from "fs"

解决办法2:

启用es模块化交互非es模块导出,且module为CommonJS

  1. {
  2. "module": "CommonJS",
  3. "esModuleInterop": true, // 启用es模块化交互非es模块导出
  4. }

编译前:

  1. import fs from "fs"
  2. console.log(fs);

编译后:

  1. var __importDefault = (this && this.__importDefault) || function (mod) {
  2. return (mod && mod.__esModule) ? mod : { "default": mod };
  3. };
  4. Object.defineProperty(exports, "__esModule", { value: true });
  5. const fs_1 = __importDefault(require("fs"));
  6. console.log(fs_1.default);

5.TS中书写commonjs模块化

  • 会导致类型检查失效。
  • 以下写法不会
  1. export = {
  2. name: "kevin",
  3. sum(a: number, b: number) {
  4. return a + b
  5. }
  6. }
  7. import obj = require("./commjs")
  8. console.log(obj);

6.模块解析

应该从什么位置寻找模块

TS中,有两种模块解析策略

  • classic:经典
  • node:node解析策略
  1. {
  2. "module": "commonjs",
  3. "moduleResolution": "node" // 设置解析模块的模式
  4. "removeComments" : true, // 编译结果中移除注释
  5. "esModuleInterop": true, // 启用es模块化交互非es模块导出
  6. }