最近由于需要重构,需要将一些可以项目中相同得页面抽成组件,做成业务组件。在这个过程中,由于一些项目技术栈古老,不支持模块。因此需要学习一下一直不甘触碰得知识点-----umd打包
umd是什么?
所谓UMD (Universal Module Definition),就是一种javascript规范,让你打包好的代码能在各个环境中使用
umd简单实现
涉及到实现。就需要先了解目前主流的模块规范CommonJS,es AMD, CMD,..他们是什么呢??
CommonJs
1、为什么要有commonjs规范?
在后端,JavaScript的规范远远落后并且有很多缺陷,这使得难以使用JavaScript开发大型应用。比如:没有模块系统、标准库较少、没有标准接口、缺乏包管理系统。而规范的提出主要是为了弥补没有标准的缺陷
2、模块规范
模块规范一共分为三个部分:模块定义、模块引用、模块标识。
模块定义:
module对象:module对象代表该模块自身
export:属性:向外提供接口,是module得一个属性
function add(num1,num2){
alert(num1+num2);
}
exports.add=function (num1,num2){
alert(num1+num2);
}
模块引入
var math = require('math');
意思为,引入了math模块。并赋值给变量math,在这里变量math不必与模块名相同,
var Math = require ('math")
赋值得意义在于引入文件中只能识别Math,而不能识别模块math,math未定义
那么有时候会看到带路径和不带路径得,又有什么区别呢?
如果node_modules下没有math,会报错,引入的模块在其他枯井,需要手动加入相对路径或者绝对路径
模块标识
模块标识指的是传递给require方法的参数,必须是符合小驼峰命名的字符串,或者以 . 、… 、开头的相对路径,或者绝对路径。
3、有什么好处?
最大得好处就是很好的剞劂变量污染得问题。每个模块独立来发互不干扰
总结:commonJS需要node环境而es6规范不需要
ES规范
es6模块其实是ECMAScript 2015标准在语言层面实现了模块话,,实现起来比较简单。import引入,export到处即可,设计得思想是尽量得静态话,使得编译时就能确定模块得依赖关系,输入输出得变量
现在打包工具很多都是利用了es6的这个特点。按需要提取代码,打出的包更加精致
//按需加载依赖
import {a ,b ,c } from "bababa"
//暴露接口
export default obj; // 默认对外接口
export var foo = 'str'; // 名称为`foo`的对外接口