ES6模块化

1. Javascript模块化概述
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

2.为什么使用模块化

<script src="library1.js"></script>
<script src="library2.js"></script>
<script src="libraryA.js"></script>

这是最原始的 JavaScript 文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在 window 对象中,不同模块的接口调用都是一个作用域中,一些复杂的框架,会使用命名空间的概念来组织这些模块的接口

3.模块系统的演进历程
这种原始的加载方式暴露了一些显而易见的弊端
1全局作用域下容易造成变量冲突
2文件只能按照

4.模块系统的演进-AMD

define("module", ["dep1", "dep2"], function(d1, d2) {
  return someExportedValue;
});
require(["module", "../file"], function(module, file) { /* ... */ });

优点:
适合在浏览器环境中异步加载模块
可以并行加载多个模块
缺点:
提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不顺畅
不符合通用的模块化思维方式,是一种妥协的实现

5.模块系统的演进-CMD
Common Module Definition 规范和 AMD 很相似,尽量保持简单,并与 CommonJS 和 Node.js 的 Modules 规范保持了很大的兼容性

define(function(require, exports, module) {
  var $ = require('jquery');
  var Spinning = require('./spinning');
  exports.doSomething = ...
  module.exports = ...
})

优点:
依赖就近,延迟执行
可以很容易在 Node.js 中运行
缺点:
依赖 SPM 打包,模块的加载逻辑偏重
6.包管理器
软件包管理器是指在计算机中自动安装、配置、卸载和升级软件包的工具组合,它在各种系统软件和应用软件中均有广泛的应用。
在最开始的时候,开发者习惯于逛各种网站,下载各种各样的源代码,然后一一把他们放到自己的项目中,这种做法费时费力,又不容易维护脚本样式的更新等。自从node.js开天辟地以后,优秀的前端开发工程师们又开始了创造之旅,这里面的翘楚有Brower、component、spm及node.js的“亲儿子”npm。
在这些工具百花齐放的时代,他们各有特点和优势,但是随着node.js的不断进化,npm也在不断升级,一开始它只是被称为Node Package Manager,用来解决node.js的包管理器,但是随着其他构建工具(browserify、webpack)的发展,仅限于浏览器场景的包,终于也可以使用commonJS或者ES6模块规范。同时npm的版本也在一直更新,解决了很多令人诟病的问题,所以到现在,npm有点一同天下的味道。
7.ES6模块化概述
ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
8.ES6模块化特点
静态加载模块,效率比CommonJS 模块的加载方式高
ES6 模块是编译时加载,使得静态分析成为可能进一步拓宽 JavaScript 的语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。
不再需要UMD模块格式了,将来服务器和浏览器都会支持 ES6 模块格式。目前,通过各种工具库,其实已经做到了这一点
将来浏览器的新 API 就能用模块格式提供,不再必须做成全局变量或者navigator对象的属性。
不再需要对象作为命名空间(比如Math对象),未来这些功能可以通过模块提供。
支持严格模式
9.package.json
当你的项目需要依赖多个包时,使用package.json才是最好的方法。package.json就是一个json文件,对比手动安装,它有以下有点。
它以文档的形式规定了项目所依赖的包。
可以确定每个包所使用的版本。
项目的构建可重复,在多人协作中更加方便。
再文件中可以定义两种类型的包。
devDependencies
仅在开发和测试环节中需要依赖的包。–save-dev
dependencies
在生产环境中需要依赖的包。–save

配置完以上之后,如果其他人也需要使用这个项目,只需要把package.json文件给他,然后进行简单的npm install 即可。这就是上面所说的一个优点–不需要把依赖都下载到本地,更便于多人合作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值