好家伙,

 

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

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

所以我决定重学一遍

 

本篇为《阮一峰 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模块化的更多相关文章

  1. 重学OpenGL(一)----工具篇

    最近想开发一个小工具,需要用到3D,果断上OpenGL,借这个过程把OpenGL重学一遍. 工欲善其事,必先利其器,先把工具都搞好. [开发语言] 果断C+OpenGL,不解释. [开发环境] Min ...

  2. ES6模块化使用遇到的问题

    前言 最近在学习ES6模块化时,遇到了一些问题,通过查询相关资料得以解决,本篇随笔详细记录了解决方法. 具体内容 以下定义一个模块common.js 在test.html中引入上述定义的模块 运行上述 ...

  3. 重学C++ (1)

    写在开头的话:这学期没有写太多的代码,终于把中英文两篇论文弄完了,趁着中间的空隙,想想找工作的处境.自己也定了自己的方向.不管学什么语言吧,每个语言都有自己的优势和使用的群体.只要自己是良马,终会有伯 ...

  4. 推翻自己和过往,重学自定义View

    http://blog.csdn.net/lfdfhl/article/details/51671038 深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 A ...

  5. 重学C语言---01概述

    1.什么是C语言 C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.计算机语言是从第二次世界大战以后,经历了戏剧性的发展过程.从机器语言到汇编语言和高级语言.C语言是与硬件 ...

  6. 【重学计算机】操作系统D1章:计算机操作系统概述

    1. 计算机软硬件系统 冯诺伊曼结构 以运算单元为核心,控制流由指令流产生 程序和数据存储在主存中 主存是按地址访问,线性编址 指令由操作码和地址码组成 数据以二进制编码 其他:参考<重学计算机 ...

  7. 重学Java(一):与《Java编程思想》的不解之缘

    说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想 ...

  8. 重学js之JavaScript 面向对象的程序设计(创建对象)

    注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...

  9. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  10. 重学HTML5的语义化

    干了这么多年的前端,之前面试的时候经常会遇到面试官提问:你是如何理解HTML的语义化的? 说实话,之前遇到这个问题的时候,都是从网上找参考答案,然后记下来,用自己的语言重新组织一下,就变成自己的理解了 ...

随机推荐

  1. 像elementui一样封装自定义按钮

    <template> <div> <button @click.prevent="coverHandler" class="btn-btn& ...

  2. c和c++开发工具之clion和vs

    个人体验结果 如果是CMake或者要跨平台的话,建议使用CLion 像我在看书写练习题的话,Clion使用cmake编译c/c++源码更简单上手使用. 如果项目不大,两者都可以.如果关联子项目或第三方 ...

  3. PDF标准详解(一)——PDF文档结构

    已经很久没有写博客记录自己学到的一些东西了.但是在过去一年的时间中自己确实又学到了一些东西.一直攒着没有系统化成一篇篇的文章,所以今年的博客打算也是以去年学到的一系列内容为主.通过之前Vim系列教程的 ...

  4. 4.基于Label studio的训练数据标注指南:情感分析任务观点词抽取、属性抽取

    情感分析任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...

  5. Python二分法

    二分法 尽管二分搜索通常优于顺序搜索,但当n较小时,排序引起的额外开销可能并不划算.实际上应该始终考虑,为了提高搜索效率,额外排序是否值得.如果排序一次后能够搜索多次,那么排序的开销不值一提.然而,对 ...

  6. DevToys(开发工具) v1.0.2.1

    从事开发工作的朋友们千万不要错过了!今天为大家带来的这款软件可以说是开发人员的必备工具,它就是DevToys软件!DevToys中包含了许多强大实用的开发工具,能够帮助用户将程序开发变得更加简单大大降 ...

  7. 跑通的第一个ethers.js程序HelloVitalik.js

    简介 ethers.js是一个本地库,可以让你调用接口,用官方写好的轮子来使用一些常用的函数!学习完这个库,你对node.js就有比较深入的了解了,如果你不做项目,就不涉及智能合约的编写,那么写点脚本 ...

  8. 【STL源码剖析】string类模拟实现 了解底层-走进底层-掌握底层【超详细的注释和解释】

    文章目录 博主对大家的话 前言 实现过程一些要注意的点 STL中string类模拟实现 尾声 博主对大家的话 从今天开始,STL源码剖析的专栏就正式上线了!其实在很多人学习C++过程中,都是只学习一些 ...

  9. abc339 详解

    第一篇整场题解纪念我第一次 AK 的 abc! A #include <iostream> using namespace std; int main(int argc, const ch ...

  10. NC23047 华华给月月出题

    题目链接 题目 题目描述 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: \(Ans=\oplus_{i=1}^N(i^N\mod(10^9+7))\) \(\ ...