模块化

yuhuo2021-08-05JavaScriptJavaScript基础

CommonJs 规范

实现方案:NodeJs

特点:

  • 运行时同步加载,只适合服务端
  • 输出值的拷贝
// 导出
// 修改 exports 对象属性值
exports.sum = sum;
module.exports.sum = sum;

// 定义新的 exports 对象
module.exports = {
    sum: sum
}

// 导入
var math = require("math");

ES6 规范

实现方案:ES6 modules

特点:

  • 编译时加载 / 运行时加载
  • 依赖就近,提前执行
  • 输出值的引用
<script type="module" src="main.js"></script>
// 导出写法1:export 后接变量定义
export let name = "张三";
export function say() {}

// 导出写法2:export 后接大括号列举变量(此大括号非对象)
let years = "18";
let run = function() {}
export {years as age, run}

// 导出写法3:export default 后接任意类型数据
let country = "中国";
export default country;
export default "中国";
export default {
    country: "中国"
}

// 上述代码相当于导出了以下完整对象
{
    name: "张三",
    age: "18",
    say: function() {},
    run: function() {},
    default: "中国",
}

// 直接导出另一个模块
export * from "./other.js"
export { something } from "./other.js"
// 编译时同步加载
// 导入 export 的数据
import {name, age as years, say} from './user.js';

// 导入 export default 的数据
import user from './user.js';

// 导入完整对象,结构如上述示例
import * as user from './user.js';

// 运行时异步加载
import("./user.js").then(function(user) {
    // 导入完整对象
})

注意

  • 同个模块内,export 可多次,export default 只能一次,两者可共存;
  • export,import 须位于模块顶层作用域下的任意位置,import 会自动提升到顶部;
  • import 是在编译时加载,不能使用动态代码,如嵌套在 if 内;
  • import 导入的是常量,import() 导入的是变量;
  • 导入的完整对象的属性都是只读属性;

AMD 规范

实现方案:RequireJs

特点:

  • 运行时异步加载
  • 依赖前置,提前执行
<script src="./require.js" data-main="./main"></script>
// main.js 入口
require.config({
    paths:{
        "a":'./moduleA',
        "b":'./moduleB',
    }
});
require(['a'],function(a){
    console.log(a)
});

// moduleA.js 模块A
define(['b'],function(b){
    console.log(b);
    return "模块A";
});

// moduleB.js 模块B
define(function(){
    return "模块B";
})

CMD 规范

实现方案:SeaJs

特点:

  • 运行时异步加载
  • 依赖就近,延迟执行
<script src="sea.js"></script>
<script>
    seajs.config({
        alias:{
            "a":"./moduleA",
            "b":"./moduleB",
        },
    });
    seajs.use('main', function(main) {
        console.log(main)
    });
</script>
// main.js 入口
define(function(require, exports, module) {
    let a = require("a");
    console.log(a);
        
    exports.name = "入口";
});

// moduleA.js 模块A
define(function(require, exports, module) {
    // 异步加载模块
    require.async(["b"], function(b) {
        console.log(b);
    });
    
    module.exports = {
        name: "模块A"
    }
});

// moduleB.js 模块B
define(function(require, exports, module) {
    exports.name = "模块B";
});
Last Updated 2024/3/14 09:51:53