ts(typescript) 模块化
模块化标准
ts 中的模块化,尽量统一使用
es6
(es2015)的模块化标准
前端领域中的模块化标准:ES6、commonjs、amd、umd、system、esnext
例如:
// a.ts 文件
// 导出一个常量
export const a: number = 1;
// 导出一个函数
export function b(a: number, b: number): number {
return a + b;
}
function defaultFunc() {
console.log('this is default function')
}
// 默认导出
export default defaultFunc;
//index.ts 文件
// require('./poker/index.ts')
import defaultFunc, { a, b } from "./a";
console.log(a, b(1, 2),defaultFunc())
结果:
编译结果对比
ts 中可以通过使用
module
设置编译结果中使用的模块化标准,这个可以依照环境的不同来设置,如浏览器设置 es6, node 设置 commonjs等,这个是灵活处理的。
-
ts 里面的代码使用的es6的导入和导出,编译的模块化是
es6
对比如下:
结论: 上面的两张图中我们可以看到,ts里面的模块化使用es6,编译的结果也是es6,他们两者是没有区别的,但是要注意一个问题,导入模块的时候千万不能使用后缀名xxx.ts
,因为编译后的结果是没有.ts
后缀的文件的 -
ts 里面的代码使用的es6的导入和导出,编译的模块化是
commonjs
对比如下
结论:ts 的配置,编译的对象可以兼容很古老的语法,为了兼容旧版本,但是ts是遵从es标准的。如果编译结果的模块化标准是commonjs
:导出的声明会变成exports的属性,默认的导出会变成exports的default
属性;
解决默认导入问题
在index.ts中直接导入fs模块, 例如import fs from 'fs'
,但是结果确实报错的,如下:
编译的结果如下(虽然说报错了, 但是ts默认是可以编译的,这个可以通过配置来进行配置):
但是如何解决这个问题呢?
- 方法一:
按需导入
import { readFileSync } from 'fs'
readFileSync('./')
编译的结果如下:这个时可以正常使用的。
- 方法二:
重命名的导入
import * as fs from 'fs'
fs.readFileSync('./')
- 方法三:在ts.config.json中配置启用
esModuleInterop
启用es模块化交互非es模块导出
import fs from 'fs'
fs.readFileSync('./')
ts 中书写common js 的代码
在ts 中,我们可以使用commonjs的语法,导出使用
module.export
或者exports.xxx
, 使用require('xxx')
来进行导入,但是这样的话就得不到 ts的类型检查了。
如何既可以使用commonjs的语法,也要能进行类型检查呢?
ts 新增了一个语法:
导出:export = xxx
导入:import xxx = require("xxx")
例如:
// a.ts 文件
// 定义一个变量
const a: number = 1;
// 定义一个函数
function b(a: number, b: number): number {
return a + b;
}
// 导出变量和函数
export= {
a: a,
b: b,
}
// index.ts 文件
import obj = require('./a');
console.log(obj.a, obj.b(1, 2))
运行结果如下:
编译结果如下:
- a.ts 文件
- index.ts 文件
ts的模块解析策略
TS中,有两种模块解析策略
- classic:经典, 已经成为过去了
- node:node解析策略(唯一的变化,是将js替换为ts)
- 相对路径
require("./xxx")
- 非相对模块
require("xxx")
- 相对路径
可以使用配置文件来进行配置:
在ts.config.json 中使用 moduleResolution
来进行模块解析策略的配置。
本博客用到的ts的配置:
配置名称 | 含义 |
---|---|
module | 设置编译结果中使用的模块化标准 |
moduleResolution | 设置解析模块的模式 |
noImplicitUseStrict | 编译结果中不包含"use strict" |
removeComments | 编译结果移除注释 |
noEmitOnError | 错误时不生成编译结果 |
esModuleInterop | 启用es模块化交互非es模块导出 |