参考: https://juejin.cn/post/6844903744518389768
至少需要知道 CMD、AMD、CommonJS、ESM 方法
不常用,核心思路是通过一个对象隔离变量
优点是不会污染全局变量,且能实现数据隐藏(不把数据挂到 root 上即可)。但是调用其他模块很困难,可以通过传入多个参数实现模块的调用。
(function(root, $) {
root.sum = function() {
}
$('body').append('hello world
')
})(window, jquery)
服务端的模块化解决方案,导入模块是同步的(区别 AMD),因为服务端的文件一般在本地所有导入无需考虑速度问题。
此外,还需注意 CommonJS 导入的数据的原数据的拷贝,也就说改变导入的数据不会影响原数据。
CommonJS 认为每个文件就是一个单独的模块,其中内置 module
变量,通过 module.exports
对象导出数据,而导入数据时,导入的就是 module.exports
中的数据。
1.js
module.exports = {
x: 1,
y: 2
}
// 或者用 exports.xxx 给 exports 对象添加属性
exports.z = 3
2.js 引入 1.js 的内容
const data = require('./1.js')
console.log(data) // { x: 1, y: 2, z: 3 }
需要注意的是,直接给 exports
变量赋值为新对象是无法导出数据的,因为这样 JS 会把当前文件的 exports
的地址指向新创建的对象,而不是把 module.exports
的地址指向新创建的对象。
module.exports === exports // true
// 改变了 exports 的指向
exports = {
x: 1
}
// 我们实际导出的是 module.exports 的内容,而不是 exports 这个变量的内容
module.exports === exports // false
基本写法
// 无模块依赖
// sum.js
define(function() {
function sum(a, b) {
return a + b
}
// 导出函数
return { sum }
})
// calc.js
// 依赖 sum.js,第一个参数为模块名,函数参数为模块对象
define(['sum'], function(sum) {
let a = 1, b = 2;
const c = sum(a, b);
return { c }
})
配置
// main.js
(function() {
require.config({
baseUrl: 'js/', // 基本路径 出发点在根目录下
paths: {
//映射: 模块标识名: 路径
sum: './modules/sum', //此处不能写成alerter.js,会报错
calc: './modules/calc'
}
})
// 导入 sum 并使用
require(['sum'], function(sum) {
console.log(sum(1, 2))
})
})()
index.js 引入 require.js 同时设置入口文件的地址
DOCTYPE html>
<html>
<head>
<title>Modular Demotitle>
head>
<body>
<script data-main="js/main" src="js/libs/require.js">script>
body>
html>
// 1.js 提供 sum 函数
define(function(requrie, exports, module) {
exports.sum = function(a, b) { // or module.exports = {}
return a + b
}
})
// main.js 导入
define(function(require) {
// 导入路径为当前模块所在的相对路径
const { sum } = requrie('./1')
console.log(sum)
})
在 html 中初始化
<script src="./js/sea.js">script>
<script>
// 注册入口模块
seajs.use('./js/main')
script>
可以看到,seajs
提供了一个 define
函数用于导入/导出模块,该函数接受一个回调函数,这个回调函数有三个参数:
// sum.js
export {
sum(a, b) {
return a + b
}
}
export default const VERSION = 1.1
// main.js
import VERSION, { sum } from 'sum'
摘抄自
作者:浪里行舟
链接:https://juejin.cn/post/6844903744518389768
来源:稀土掘金