其他分享
首页 > 其他分享> > 前端模块化规范

前端模块化规范

作者:互联网

前端为什么需要模块化?

随着前端能承担更多的开发责任,各种问题开始凸显,全局变量冲突、依赖关系难以管理、数据安全问题等等。

什么是模块?

模块化的好处?

那么模块化规范有哪些呢?

模块化规范

CommonJS

CommonJS是服务器端模块的规范,Node.js采用了这个规范。每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。在服务器端,模块的加载是运行时同步加载的;在浏览器端,模块需要提前编译打包处理。

(1)、基本语法

// 定义模块math.js
const value = 1
const add = function(){
    value++
}
module.exports = {
    value,
    add
}
// 引入模块math.js
const math = require('./math')
math.add()
// 会发现value的值还是1
console.log(math.value)

注意导出的时候还可以使用exports.xxx = value
(2)、特点

AMD

主要用于客户端,异步加载。AMDCommonJS的主要区别在于它是否支持异步模块加载。

// 定义导出模块
// 不依赖其它模块的模块定义
define(function(){
   return 模块
})
// 依赖其它模块的模块定义
// 第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。
define(['module1', 'module2'], function(m1, m2){
   return 模块
})
// 引入模块
require(['module1', 'module2'], function(m1, m2){
    return 模块
})

UMD

它就像是一个工厂,为了同时支持CommonJSAMD的规范,判断谁的规范支持就使用谁的规范,他的外层是一个iife。并且支持直接在前端用<script src="lib.umd.js"></script>的方式加载。

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['b'], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory(require('b'));
    } else {
        // Browser globals (root is window)
        root.returnExports = factory(root.b);
    }
}(this, function (b) {
    //use b in some fashion.
 
    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {}
}));

ESM

ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
浏览器直接通过<script type="module">即可使用该写法。NodeJS可以通过mjs后缀或者在package.json添加"type": "module"来使用。

(1)、基本语法

// 定义模块 math.js 
var basicNum = 0;
var add = function (a, b) {
    return a + b;
};
export { basicNum, add };
// 引用模块
import { basicNum, add } from './math';
function test(ele) {
    ele.textContent = add(99 + basicNum);
}

(2)、特点

参考文章

1、前端模块化详解(完整版)
2、前端模块化一——规范详述
3、前端模块化iife、CJS、AMD、UMD、ESM的区别
4、打包umd_cjs, umd, esm or iife?

标签:function,CommonJS,模块化,前端,规范,module,模块,math,加载
来源: https://www.cnblogs.com/summerstar/p/15869138.html