ES6的模块
导出
// 单独导出
export let a = 1
// 批量导出
let b = 2
let c = 3
export { b, c }
// 导出接口
export interface P {
x: number;
y: number;
}
// 导出函数
export function f() {}
// 导出时起别名
function g() {}
export { g as G }
// 默认导出,无需函数名
export default function () {
console.log("I'm default")
}
// 导出常量
export const str = 'Hello'
// 引入外部模块,重新导出
export { str as hello } from './b'
导入
import { a, b, c } from './a' // 批量导入
import { P } from './a' // 导入接口
import { f as F } from './a' // 导入时起别名
import * as All from './a' // 导入模块中所有成员,绑定在 All 上
import myFunction from './a' // 不加{},导入默认
console.log(a,b,c)
let p: P = {
x: 1,
y: 1
}
console.log(All)
myFunction()
CommonJS(Node)模块
导出
let a = {
x: 1,
y: 2
}
// 整体导出
module.exports = a
// exports === module.exports
// 导出多个变量
exports.c = 3
exports.d = 4
导入
let c1 = require('./a.node')
let c2 = require('./b.node')
console.log(c1, c2)
两个配置项
在ts中可以用ts-node插件直接运行ts文件
在生产环境中,两个系统模块会编译成什么?
在tsconfig.json
中,target
配置项表示的是要编译的目标语言是什么版本,ts中生成的target
默认值是es5
module
配置项是把我们的代码编译成什么模块系统,ts中module
默认值是commonjs
在命令行中tsc
的默认值是es3
,在使用tsc时,默认忽略tsconfig配置文件
tsc ./src/es6/a.ts -t es3
tsc ./src/es6/a.ts -t es5
tsc ./src/es6/a.ts -t es6
// -t: -target
tsc ./src/es6/a.ts -m amd
tsc ./src/es6/a.ts -m umd
// -m: -module
这里,会有两个模块的系统兼容问题,在编译的时候,默认会把所有模块编译成commonjs,这时就会对导入导出做一些特殊的处理
处理es6中的默认导出,不再试顶级属性,在导入的时候同样
在es6中,允许有次级的导出,在commonjs中,只允许模块有一个顶级导出(module.exports),如果一个模块有多个次级导出,再出现一个顶级导出,则会覆盖前面的次级导出,在es6中则不会出现这种问题
但是一个模块用es6的方式做了默认导出,另一个模块用非es6的方式做了导入,就会产生问题
esModuleInterop
配置项如果开启的话,就允许export =
的方式导入,也可以export from
的方式导入