好家伙,

 

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

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

所以我决定重学一遍

 

本篇为《阮一峰 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. [转帖]Redis 使用指南:深度解析 info 命令

    https://www.cnblogs.com/hwpaas/p/9442410.html Redis 是一个使用  ANSI C 编写的开源.基于内存.可选持久性的键值对存储数据库,被广泛应用于大型 ...

  2. 数据结构与算法 第二章线性表(48课时课程笔记)Data Structure and Algorithms

    2.1 线性表的类型定义 一个线性表是n个数据元素的有限序列. (1)结构初始化 InitList(&L) 构造一个空的线性表L. (2)销毁结构 DestroyList(&L) (3 ...

  3. AppCan 打包无限次下载解决方案

    1.下载AppCan 官网上打包好的文件apk文件 2.将apk文件放在指定的服务器文件内,谇文件发布到IIS,一般都会用已发布发的网站上面随便一个目录就可以了. 3.MIME类型中填写apk的MIM ...

  4. windows10卸载小娜

    适用于2004版本往后的 win+x如图 输入如下代码 Get-AppxPackage-allusersMicrosoft.549981C3F5F10|Remove-AppxPackage 运行结束后 ...

  5. 深度学习应用篇-自然语言处理[10]:N-Gram、SimCSE介绍,更多技术:数据增强、智能标注、多分类算法、文本信息抽取、多模态信息抽取、模型压缩算法等

    深度学习应用篇-自然语言处理[10]:N-Gram.SimCSE介绍,更多技术:数据增强.智能标注.多分类算法.文本信息抽取.多模态信息抽取.模型压缩算法等 1.N-Gram N-Gram是一种基于统 ...

  6. ChatGPT 对接微信公众号技术方案实现!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 9天假期写了8天代码和10篇文章,这个5.1过的很爽! 如假期前小傅哥的计划一样,这个假期开启 ...

  7. 字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 到本章为止已经写了四篇关于字节码编程的内容,涉及了大部分的API方法.整体来说对 J ...

  8. tomcat搭建本地文件服务器(windows版本)

    1.下载tomcat 2.配置环境变量 在"我的电脑"(右键)->"属性"->"高级属性设置"->"环境变量&q ...

  9. P8659 [蓝桥杯 2017 国 A] 数组操作 题解

    题目链接:洛谷 或者 蓝桥杯 或者 C语言中文网 几个OJ的AC记录: 忘了哪个OJ的: 洛谷: C语言中文网: 蓝桥杯: emmmmmmm,好像每个OJ给的时限和空间还不一样,蓝桥杯官方还给了 $3 ...

  10. [Elasticsearc] Elasticsearch 初见

    Elasticsearch 初见 启动 双击 bin 目录下的 elasticsearch.bat 文件,等待终端运行成功 索引的增删改查 增(PUT) postman 发送请求 PUT 请求:htt ...