// 将其他的模块汇集到主模块
let uniq = require('uniq')
let module1 = require('./modules/module1')
let module2 = require('./modules/module2')
let module3 = require('./modules/module3')
module1.foo()
module2()
module3.foo()
module3.bar()
let result = uniq(module3.arr)
console.log(result)
title: JS 组织代码方式演变——模块化 date: 2020-05-15 19:33 updated: 2020-05-15 19:33 cover: //cdn.wallleap.cn/img/pic/cover/202302GKk2ms.jpg category: 技术杂谈 tags:
前端 description: JS 组织代码方式演变——模块化
看别人的代码的时候,有些人写的代码一团糟,可是有些人的代码进行合理的分块,看起来很容易阅读理解。
1、是什么
什么是模块?
一个模块的组成
模块化
2、模块化的进化过程
代码之间会相互依赖(A 需要 B 中的变量/函数),应该怎样对代码进行组织呢
(1)通过注释进行组织
优点:极简
缺点
(2)用函数组织代码
编码:全局变量/函数
问题:污染全局命名空间, 容易引起命名冲突/数据不安全
缺点
(3)用命名空间(namespace) 组织代码
编码:将数据/行为封装到对象中,使用的时候
对象名.方法
解决:命名冲突(减少了全局变量)
问题:数据不安全(外部可以直接修改模块内部的数据)
优点:占用的全局变量少,只有一个
app
缺点
(4)立即执行函数
IIFE:立即调用函数表达式--->匿名函数自调用
编码:将数据和行为封装到一个函数内部, 通过给 window 添加属性来向外暴露接口
优点
缺点:无法处理循环依赖 → 无解
(5)CommonJS
Node.js:服务器端
基本语法:
每个文件都可以当作一个模块
引入模块发生在什么时候?
优点
缺点:不支持异步/浏览器环境 → AMD
(6)AMD (异步模块定义)
浏览器端,模块的加载是异步的
require.js
基本语法
定义暴露模块:
define([依赖模块名], function(){return 模块对象})
引入模块:
require(['模块1', '模块2', '模块3'], function(m1, m2){//使用模块对象})
优点
缺点
(7)ES Modules(ES 模块)
ES 6 内置了模块化的实现
<script type="module" src="index.js"></script>
基本语法
定义暴露模块:
export
暴露一个对象:
暴露多个:
引入使用模块:
import
default 模块:
其它模块
问题:有些浏览器还不能直接识别 ES 6 模块化的语法
优点
import()
,是个 promise)缺点
.mjs
后缀3、模块化演示
1、CommonJS 基于服务器端(Node.js)
下载安装 Node.js
创建目录结构
Modules
module1.js
module2.js
module3.js
app.js
package.json(命令创建
npm init
,再输入包名)下载第三方模块
npm install uniq --save
模块化编码
通过 node 运行 app.js——
node app.js
2、CommonJS 基于浏览器端应用(Browserify)
创建项目结构
js
dist //打包生成文件的目录
src //源码所在的目录
index.html
package.json
下载 browserify
全局:
npm install browserify -g
局部:
npm install browserify --save-dev
下载第三方模块
npm install uniq --save
定义模块代码
打包处理 js:
browserify js/src/app.js -o js/dist/bundle.js
页面使用引入
3、AMD 规范
(1)NoAMD
项目结构
文件内容
(2)AMD(require.js)
下载 require.js, 并引入
创建项目结构
定义require.js的模块代码
dataService.js
alerter.js
应用主(入口) js:main.js
页面使用模块:index.html
使用第三方基于 require.js 的框架(jquery)
将 jquery 的库文件导入到项目:
在 main.js 中配置 jquery 路径
在 alerter.js 中使用 jquery
使用第三方不基于 require.js 的框架(angular/angular-messages)
将 angular.js 和 angular-messages.js 导入项目
在 main.js 中配置
页面:
5、CMD规范
下载 sea.js, 并引入
创建项目结构
定义sea.js的模块代码
module1.js
module2.js
module3.js
module4.js
main.js: 主(入口)模块
index.html:
6、ES6-Babel-Browserify 使用
定义 package.json 文件
安装 babel-cli, babel-preset-es2015 和 browserify // cli——command line interface
npm install babel-cli browserify -g
npm install babel-preset-es2015 --save-dev
定义
.babelrc
文件(babel run control)编码
js/src/module1.js
js/src/module2.js
js/src/module3.js
js/src/app.js
编译
babel js/src -d js/lib
browserify js/lib/app.js -o js/lib/bundle.js
页面中引入测试
引入第三方模块(jQuery)
下载jQuery模块:
npm install jquery@1 --save
// @后的是版本,1代表1.x.x
中的最新版本在app.js中引入并使用