1、ES6模块系统

1-1、export 导出

(1)、单独导出

// a.ts

export let a = 1;

(2)、批量导出

// a.ts

let b = 2;
let c = 3; export { b, c };

(3)、导出接口

// a.ts

export interface Info {
name: string;
age: number;
}

(4)、导出函数

// a.ts

export function f() {
console.log('function f');
}

(5)、导出时 起别名

// a.ts

function g() {
console.log('function g');
} export { g as G }

(6)、默认导出,无需函数名

// a.ts

export default function() {
console.log('default function');
}

(7)、导出常量

// b.ts

export const str = 'hello';

(8)、引入外部模块,重新导出

// a.ts

export { str as hello } from './b';

1-2、import 导入

(1)、批量导入

import { a, b, c } from './a';

console.log('a, b, c: ', a, b, c);   // a, b, c:  1 2 3

(2)、导入接口

import { Info } from './a';

let jim: Info = {
name: 'Jim Green',
age: 12
} console.log('jim', jim); // jim { name: 'Jim Green', age: 12 }

(3)、导入时 起别名

import { f as foo } from './a';

foo();   // function f

(4)、导入模块中的所有成员,绑定在All上

import * as All from './a';

console.log(All.G());   // function g
console.log(All.g()); // 类型“typeof import("e:/study/ts-demo/es6/a")”上不存在属性“g”

(5)、不加 {},导入默认

import myFunction from './a';

myFunction();   // default function

2、CommonJS 模块系统

2-1、exports 导出

(1)、module.exports 整体导出

// a-node.ts

let a = {
x: 2,
y: 3
}; module.exports = a;

(2)、exports 导出多个变量

// b-node.ts

exports.c = 3;
exports.d = 4;

2-2、require 导入

let a1 = require('./a-node');
let b1 = require('./b-node'); console.log(a1); // {x: 2, y: 3}
console.log(b1); // {c: 3, d: 4}

3、export = 和 import = require()

当一个模块使用 ES6模块导出,CommonJS模块导入时,就会出现模块不兼容的情况

let a2 = require('../es6/a.ts');

a2();   // Uncaught TypeError: a2 is not a function

理论上,调用a2 方法其实就是调用 a.ts 中 export.default 默认导出的那个方法,但是此处报错了。这里有两个解决方法:

(1)、调用 default 方法(不推荐)

let a2 = require('../es6/a.ts');

a2.default();   // default function

(2)、export = 语法

export = 语法定义一个模块的导出对象,它可以是类、接口、命名空间、函数或枚举

若要导入一个 export = 的模块时,必须使用 ts 提供的特定语法 import module = require('module')

// d.ts

// export 会被编译成 CommonJS中的 module.exports,同时,意味着这个模块中不能再有其它的导出

export = function () {
console.log('hello world');
}
import a3 = require('../es6/d');

a3();   // hello world
很多库使用了 CommonJS 的导出方式,如 module.exports=a,这样会导致使用ES的方式导入时失败,如 import a from 'X'。因为ES会默认访问 a 的 default 属性。TypeScript 为了兼容,引入了 esModuleInterop 选项,在编辑时自动添加default属性。
 
当开启 tsconfig.json 中的 esModuleInterop 选项时,可以使用 ES6模块的导入语法
import a3 from '../es6/d';

a3();   // hello world

如果关闭该选项,使用 ES6模块语法导入时则会报错

Typescript 实战 --- (9)ES6与CommonJS的模块系统的更多相关文章

  1. 全面解析ECMAScript 6模块系统

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  2. 对于模块加载:ES6、CommonJS、AMD、CMD的区别

    运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有 ...

  3. TypeScript模块系统、命名空间、声明合并

    命名空间 命名空间能有效避免全局污染.在ES6引入模块之后,命名空间就较少被提及了.如果使用了全局的类库,命名空间仍是一个好的解决方案. namespace Shape{ const pi = Mat ...

  4. ES6 的模块系统

    原文地址:https://hacks.mozilla.org/2015/08/es6-in-depth-modules/ ES6 是 ECMAScript 第 6 版本的简称,这是新一代的 JavaS ...

  5. 读懂CommonJS的模块加载

    叨叨一会CommonJS Common这个英文单词的意思,相信大家都认识,我记得有一个词组common knowledge是常识的意思,那么CommonJS是不是也是类似于常识性的,大家都理解的意思呢 ...

  6. 深入ES6 模块系统

    深入ES6 模块系统 本文转载自:众成翻译 译者:neck 链接:http://www.zcfy.cc/article/4436 原文:https://ponyfoo.com/articles/es6 ...

  7. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  8. 【前端】CommonJS的模块加载机制

    CommonJS的模块加载机制 CommonJS模块的加载机制是,输入的是被输出的值的拷贝.也就是说,一旦输出一个值,模块内部的变化就影响不到这个值. 例如: // lib.js var counte ...

  9. Webpack - CommonJs & AMD 模块打包器

    Webpack 是一个 CommonJs & AMD 模块打包器.可以把你的 JavaScript 代码分离为多个包,在需要的时候进行加载,支持预处理文件,例如 json, jade, cof ...

随机推荐

  1. python 基础之深浅拷贝

    深浅拷贝 s=[[1,2],'fgfgf','cx'] s3=s.copy() print(s) print(s3) 测试 D:\python\python.exe D:/untitled/dir/f ...

  2. python爬虫(九) requests库之post请求

    1.方法: response=requests.post("https://www.baidu.com/s",data=data) 2.拉勾网职位信息获取 因为拉勾网设置了反爬虫机 ...

  3. Python学习笔记008

    while循环 while 条件 : 执行 num =1 while num<=10:    print(num)    num+=1 1-100偶数 方法1 num =2 while num& ...

  4. c++将字符转换成字符串

    转载:https://blog.csdn.net/dididisailor/article/details/83189135 char c; string str; stringstream stre ...

  5. e_book

    1. 奢侈的纸制书籍 2. 电子书 2.1 与印刷书籍的比较 2.2 电子书格式 2.2.1 Kindle 2.2.2 PDF 2.2.3 EPUB 2.2.4 更多电子书格式比较 2.3 公共领域的 ...

  6. python学习 —— 使用QRCode包生成二维码

    我使用的是python3,最简单的方法就是使用QRCode,如果没有安装QRCode package,那么可以使用下面命令进行安装: pip3 install QRCode 然后,测试一下: from ...

  7. NOIP2019 旅行

    注意!注意!前方高能!本题卡常!!! 我们发现,所有的狗血剧情都在告诉我们,树的话直接dfs就出来了 那么基环树呢? 其实只要暴力删边,理论上的复杂度是可以过的qwq 但是删哪条边呢? 这里要引出一个 ...

  8. Go语言的流程控制(条件,选择,控制,跳转,闭包)

    1.条件语句: 跟C和python又不同了Go的if -else是这样的 if a<5{ return 0 } else { reutrn 1 } 1.条件不需要用括号括起来 2.左边的花括号必 ...

  9. nginx_1_初始nginx

    一.nginx简介: nginx是一个性能优秀的web服务器,同时还提供反向代理,负载均衡,邮件代理等功能.是俄罗斯人用C语言开发的开源软件. 二.安装nginx step1:安装依赖库 pcre(支 ...

  10. ADV-292 计算行列式 java

    问题描述 //据说很多人的题目会有一大堆废话,本傻×就不在这里废话了. 给定一个N×N的矩阵A,求|A|. 输入格式 第一行一个正整数N. 接下来N行,每行N个整数,第i行第j个数字表示A[i][j] ...