js模块化实现方式介绍
# 闭包
- 最基本的模块化,产生一个独立的代码作用快
function model(){
let obj = {
name: 'susan',
age: 18
}
function init(){
...
return obj
}
return {
init: init()
}
}
$(function(){
model.init
}())
# commonJs
- 最初应用于node模块系统,同步方式编写模块
// 编写模块model
module.exports = {
name: 'susan',
age: 18,
init(){
...
return {name, age}
}
}
// 使用require导入模块
let model = require('model')
model.init()
# AMD
- 定义了一种异步模块规范,requireJs是对该规范的实现
基本用法定义user.js模块
// 参数分别为依赖的其他模块,回调
define([depends], function(){
let userInfo = []
return {
init(){...},
getInfo(){...},
setInfo(id, info){
userInfo.push({id, info})
}
}
})
定义入口文件app.js,入口文件指的是讲所有模块汇总在一个require中暴露给外界使用
// 参数配置
require.config({
baseUrl: 'src',
paths: {
jquery: 'src/js/lib/jquery-3.3.1'
}
})
require(['js/user'],function(user){
user.init()
document.getElementById('addUser').addEventListener('click', function(){
user.setInfo(id, info)
})
})
在html中使用
<script data-main="./app.js" src="./js/lib/require.js"></script>
# CMD
- 也是一套异步规范,阿里玉伯推广sea.js中对模块化规范的产出
- module代表当前模块
- module.exports定义模块对外接口
- 作者已经放弃治疗了,不再维护
定义模块a.js
define(function(require, exports, module){
let name = 'susan'
let age = 18
exports.init = function(){
return {name, age}
}
})
定义入口文件
// 定义模块默认传入三个参数
define(function(require, exports, module){
// 按需加载
let a = require('./a')
console.log(a.init())
})
html中引入入口文件
<body>
<script src='sea.js'></script>
<script>
seajs.use('./js/main.js')
</script>
</body>
# ES6模块化
定义模块,fun.js
function add(x, y){
return x+y
}
function reduce(x, y){
return x-y
}
export {add, reduce}
// 或者写法如下,导出一个整体,使用方式稍有差异
export default {add, reduce}
// 调用如下 名字随便起
import module from './fun.js'
module.add(1, 2)
加载模块
import {add, reduce} from './fun.js'
function add(){
add(10, 20)
}