1.相关配置
配置名称 | 含义 |
---|---|
module | 设置编译结果中使用的模块化标准 |
moduleResolution | 设置解析模块的模式 |
noImplicitUseStrict | 编译结果中不包含”use strict” |
removeComments | 编译结果中移除注释 |
onEmitOnError | 错误时不生成编译结果 |
esModuleInterop | 启用es模块化交互非es模块导出 |
2.前端领域中的模块化标准
TS中,导入和导出模块,统一使用ES6的模块化标准。
注意:导入模块时,不要添加后缀名ts,因为导入导出代码会进行编译的,导致编译时找不到文件。
3.编译结果中的模块化
可配置 tsconfig.json 文件
{
"module": "commonjs",
"module": "es6", // 编译前和编译后无变化
"removeComments" : true, // 编译结果中移除注释
"esModuleInterop": true, // 启用es模块化交互非es模块导出
}
导入编译前:
import { name, sum } from './myModule'
import obj from "./myModule"
console.log(name);
console.log(sum(3, 5));
console.log(obj);
console.log(obj.name);
导入编译后:
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const myModule_1 = require("./myModule");
const myModule_2 = __importDefault(require("./myModule"));
console.log(myModule_1.name);
console.log((0, myModule_1.sum)(3, 5));
console.log(myModule_2.default);
console.log(myModule_2.default.name);
导出编译前:
export const name: string = "kevin"
export function sum(a: number, b: number): number {
return a + b;
}
export default {
name: "zhangsan",
age: 23
}
导出编译后:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sum = exports.name = void 0;
exports.name = "kevin";
function sum(a, b) {
return a + b;
}
exports.sum = sum;
exports.default = {
name: "zhangsan",
age: 23
};
4.解决默认导入的错误
在导入node内置模块时,比如 import fs from "fs"
由于 fs 是node内置模块,故它导出的是module.export对象,而不是默认导出。
因此用ES6模块化默认导出( import fs from "fs"
)时会报错。
解决办法1:
import * as fs from "fs"
解决办法2:
启用es模块化交互非es模块导出,且module为CommonJS
{
"module": "CommonJS",
"esModuleInterop": true, // 启用es模块化交互非es模块导出
}
编译前:
import fs from "fs"
console.log(fs);
编译后:
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
console.log(fs_1.default);
5.TS中书写commonjs模块化
- 会导致类型检查失效。
- 以下写法不会
export = {
name: "kevin",
sum(a: number, b: number) {
return a + b
}
}
import obj = require("./commjs")
console.log(obj);
6.模块解析
应该从什么位置寻找模块
TS中,有两种模块解析策略
- classic:经典
- node:node解析策略
{
"module": "commonjs",
"moduleResolution": "node" // 设置解析模块的模式
"removeComments" : true, // 编译结果中移除注释
"esModuleInterop": true, // 启用es模块化交互非es模块导出
}