第137篇:重学ES6模块化

重学,es6,模块化 · 浏览次数 : 29

小编点评

**阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版** **第23章“Module 的语法”学习笔记** **1.概述** 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。 **2.模块的整体加载** * 使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。 ```javascript // moduleA.mjs export { add, multi }; // moduleB.mjs import * as module from "./moduleA.mjs"; console.log(module.add(2)); console.log(module.multi(3)); ``` **3.export default 命令** * 使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。 但用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法。 首先我们定义一个匿名函数在`moduleA.mjs`中 ```javascript // moduleA.mjs export default function (a) { return a + 2; } ``` **4.跨模块常量** * 目录结构如下: ``` constants/db.mjsexport const db = { ... }; ``` * 可以在`constants/index.mjs`中定义并导出常量 ```javascript // constants/index.mjs export { users } from './users.mjs'; ``` **5.运行结果** ``` (我想我的飞机大战中的配置项config.js可以这么搞) ``` **总结** * 模块是JavaScript 中一种新的语法,可以使代码更清晰易读。 * 模块设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。 * 模块可以跨多个文件共享常量和方法。

正文

好家伙,

 

我原本以为学完模块化之后,就能非常顺利的完成我的项目分包,

然而并没有,这是非常重要的知识,而我没有学好

所以我决定重学一遍

 

本篇为《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》第23章"Module的语法"学习笔记

 

 

1.概述

历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。

 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。

ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量

 

 

2.模块的整体加载

可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

//moduleA.mjs
function add(a) {
    return a + 2;
}

function multi(a) {
    return a * 2;
}

export {
    add,
    multi,
};

 

//moduleB.mjs
import * as module from "./moduleA.mjs"

console.log(module.add(2))
console.log(module.multi(3))

测试运行:

 

 模块整体加载所在的那个对象,应该是可以静态分析的,所以不允许运行时改变。

 

3.export default命令

从前面的例子可以看出,使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。

但是,用户肯定希望快速上手,未必愿意阅读文档,去了解模块有哪些属性和方法。

首先我们定义一个匿名函数在moduleA.mjs中

//moduleA.mjs
export default function (a) {
    return a + 2;
}

moduleA.mjs
在moduleB.mjs文件中
//moduleB.mjs
import add from "./moduleA.mjs";

console.log(add(2))

 

上面代码moduleA.mjs的默认输出是一个函数。

其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。

 (就是说,在这个例子中,我们把moduleA.mjs当作开发者,把moduleB.mjs当作使用者

对于开发者而言,开发者将模块导出后,使用者是不知道方法名字的

而默认导出,将方法的命名权给了使用者,这确实是非常人性化的设计)

 

即使定义了方法名,在导入时也能重新命名

//moduleA.mjs
export default function add(a) {
    return a + 2;
}

 

//moduleB.mjs
import adddd from "./moduleA.mjs";

console.log(adddd(2))

// 4

 

 

4.跨模块常量

 目录结构如下:

 

如果想设置跨模块的常量(即跨多个文件),或者说一个值要被多个模块共享,可以采用下面的写法。

// constants/db.mjs
export const db = {
    url: 'http://my.couchdbserver.local:5984',
    admin_username: 'admin',
    admin_password: 'admin password'
  };

 

// constants/users.mjs
export const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator'];

 

// constants/index.mjs
export {db} from './db.mjs';
export {users} from './users.mjs';

 

//moduleB.mjs
import {db, users} from './constants/index.mjs';

console.log(db)
console.log(users)

 

运行结果如下:

 

 (我想我的飞机大战中的配置项config.js可以这么搞)

 

与第137篇:重学ES6模块化相似的内容:

第137篇:重学ES6模块化

好家伙, 我原本以为学完模块化之后,就能非常顺利的完成我的项目分包, 然而并没有,这是非常重要的知识,而我没有学好 所以我决定重学一遍 本篇为《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》第23章"Module的语法"学习笔记 1.概述 历史上,JavaScript 一直没有

第一百零五篇:变量的原始值和引用值

好家伙,JS基础接着学, 本篇内容为《JS高级程序设计》第四章学习笔记 1.原始值和引用值 ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。 在把一个值赋给变

第一百零六篇:变量的不同声明(var,let和const的不同)

JS关于变量的声明,变量提升,暂时性死区

第一百零七篇:基本数据类型(undefined,null,boolean类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Number, String和Symbol。 Symbol (符号)是ECMAScript6新增的。还有一种复杂数据类型

第一百零八篇:最常用的基本数据类型(Number类型)

最常用的基本数据类型(Number类型)

第一百一十篇:内存泄漏和垃圾回收(JS)

好家伙,本篇内容为《JS高级程序设计》第四章的学习笔记 1.内存泄露 1.1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其

第一百一十一篇:基本引用类型Date

好家伙,本篇为《JS高级程序设计》第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像极了“类”) 经常被人错误的称作“类”。 虽然从技术上讲JavaScript是一门面向对象语言,但是ECMAScri

第一百一十二篇: JS数组Array(一)数组基本用法

好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。 跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据, 但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。 这意味着可以创建一个数组,它的第

第一百一十四篇: JS数组Array(三)数组常用方法

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill()。 这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。 使用这个方法不会改变数组的大小。 1.1.fi

第一百一十五篇: JS集合引用类型Map

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.Map ECMAScript6以前,在JavaScript中实现“键/值”式存储可以使用object来方便高效地完成,也就是使用对象属性作为键,再使用属性来引用值。 但这种实现并非没有问题,为此TC39委员会专门为“键/值”存储定