javaScript模块化
什么是模块化?
即将一个复杂的程序依据一定的规则(规范)封装成几个块(文件),并用规定语法将其组合在一起,块的内部数据/实现是私有的,只是向外部暴露一些接口(方法)与外部其他模块通信
以前的代码
全局模式
1 | function foo(){ |
问题:所有的函数都被绑定在了window
上,容易产生命名冲突和产生对window
的污染
namespace模式
将函数或者数据绑定在对象上
1 | let obj = { |
问题:对象中的数据可以随意被修改,所以数据不安全
IIFE(Immedicately-invoked-function-expression)
该方法就是利用函数的作用域和即使函数的特性
1 | (function(window){ |
或者
1 | (function(window){ |
IIFE就是现代化模块化的基石
模块化的好处
- 避免命名冲突
- 根据功能点进行更好的分离
- 更高的复用性
- 高可维护性
但是以此同时就出现了问题
- 一个页面需要引入多个js文件,如果多个文件之间有依赖关系,先后顺序的错误就会导致报错
- 请求过多
- 依赖模糊
- 难以维护
这时候我们就需要引入一种模块化的规范来避免这种问题,下面我们来看看有哪些模块化规范
模块化的规范
- CommonJS(nodejs就是基于这种规范)
- AMD (用的少)
- CMD(阿里的人写的。用的少)
- ES6
CommonJS
说明:
- 每一个文件都是一个模块
- 服务器端:模块的加载是运行时同步加载的
- 浏览器端:需要自己编译打包将所有的模块js合并到一个js中
定义模块:
1 | module.exports={} |
引入模块:
1 | let module1 = require(..) |
服务器端例子:
先创建项目结构
1 | -modules |
module1.js
1 | module.exports = { |
module2.js
1 | exports.foo = function(){ |
module3.js
1 | module.exports = function(){ |
app.js
1 | let module1 = require('./modules/module1.js') |
package.json
1 | { |
可以使用npm init
生成该文件
客户端例子:
结构树如下
1 | -test |
js代码如上
下载编译工具
1 | npm install browserify -g # 全局安装 |
使用该工具
1 | browserify src/app.js -o dist/budle.js |
index.html
1 |
|
AMD
说明:AMD((Asynchronous Module Definition))专门用户浏览器端,模块的加载是异步的
此规范依赖于一个Require.js
基本语法:
定义模块:
1 | // 没有依赖其他模块 |
引入模块
1 | require(['module1','module2'],function(m1,m2){ |
例子:
目录结构
1 | -test |
mudule1.js
1 | define(function(){ |
module2.js
1 | define(['module1'],function(m1){ |
main.js
1 | (function(){ |
页面中只要引入该标签即可
1 | <script data-main="js/main.js" src=js/libs/require.js></script> |
ES6规范
说明:该规范也需要编译打包处理,先使用babel
将ES6转化为ES5,然后使用browserify
将其并为一个js文件
基本语法:
导出模板:
1 | export function foo(){ |
引入模块:
1 | // 常规导出,这边用对象接 |
例子:
项目结构
1 | -test |
安装依赖
1 | npm install browserify --save-dev |
创建.babelrc
rc就是run control运行时控制文件
1 | { |
module1.js
1 | export function foo(){ |
module2.js
1 | function f1(){ |
module3.js
1 | export default { |
main.js
1 | import {foo,abc} from './module1.js' |
es6转es5
1 | babel js/src -d js/build |
这里如果出现这个错误:
1 | babel : 无法加载文件 C:\Users\win\AppData\Roaming\npm\babel.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/ go.micros |
那么你输入以下命令一定是这样的
1 | get-ExecutionPolicy |
这时候,先使用管理员身份打开Windows Powershell
然后输入以下命令
1 | set-ExecutionPolicy RemoteSigned |
合并文件
1 | browserify js/build/main.js -o js/dist/bundle.js |
index.html
导入js
1 | <script src="js/src/dist/bundle.js"></script> |