webpack 和 rullup都是打包工具:
webpack倾向于应用程序的打包
rollup更适合在文件打包方面,例如 jq库, vue代码库等
模块化是模块编程思想的体现,在开发环境中,通过本地启用server方式的开发;例如 nodejs
在浏览器环境中是不能直接支持的 或者 存在兼容问题,这需要一个打包工具使打包后的代码可以在浏览器环境中良好运行。(打包成静态代码)
模块化的核心:
1. 独立的作用域
2.导出模块内的数据 (模块数据的输出)
3.引入模块内的数据
2和3合起来是模块数据的导出和利用
commonJS 规范
核心:
独立作用域: 一个文件是一个模块 (通过直接读取硬盘文件实现,如Nodejs通过文件系统实现)
导出模块内的数据: module.exports 或 exports 导出数据 ---> 每个文件都有一个 module 对象,导出的数据挂载在上面
引入模块内的数据: let a = require("./a.js"); ---> 引入的是导出的数据
对比:
数据:
后端同步加载,文件系统;
web ajax 异步加载
nodeJS 文件系统、I/O操作及net操作等在浏览器中无法实现
(此规范无法在浏览器中实现,只有另外制定了一套规范);
WEB模块化规范:
AMD UMD ESM
CMD 叫做通用模块定义规范(Common Module Definiton),它是类似于 CommonJs 模块化规范,但是运行于浏览器之上的
淘宝玉伯的 SeaJS 库
CMD 规范拥有简单、异步加载脚本、友好的调试并且兼容 Nodejs
define(function(require, exports, module) { var a = requrie("./a"); module.exports = { a: 1, b: a }; });
AMD 异步模块定义
requireJS库 (开发需要有服务端环境才能运行) define定义模块 require引入模块
引入代码库: <script data-main="./main.js" src="./vendors/require.js"></script> ---> 是独立与浏览器之外的,server
data-main: 项目的入口文件名字路径, 当 requirejs 库加载完后会自动加载入口文件;(head中会自动通过 script 标签 引入入口文件) 模块的定义: define()方法定义模块, define({a:1, b:2, c:3}) ---> 可以是直接一个对象,导出的是一个对象 define(function(){ return obj }) ---> 通过回调函数 必须有 return 数据的导出: 同模块的定义 数据的引入:
静态引入:define(["./a","./b"],function(a,b){ console.log(a, b)}) 依赖前置 动态引入: define(function(requrie){ let a = require("./a"); console.log(a) }); 需要时require
模块的配置:require.config 方法
require.config({ paths: { jquery: 'jquery.min' } });
UMD : 通用模块定义规范(Universal Module Definition)
同一个 JavaScript 包运行在浏览器端、服务区端等(符合多端规范)
(它没有自己专有的规范,是集结了 CommonJs、CMD、AMD 的规范于一身)
((root, factory) => { if (typeof define === 'function' && define.amd) { //AMD define(['jquery'], factory); } else if (typeof exports === 'object') { //CommonJS var $ = requie('jquery'); module.exports = factory($); } else { root.testModule = factory(root.jQuery); } })(this, ($) => { //todo });
ESM
es6 module : 静态加载,export 和 export 不能出现在判断等动态语句
获取的是模块接口的引用(模块内数据发生改变,接口引用数据也会改变)
es6 module内部自动采用严格模式
=====================没有从语言层面上根本解决模块化问题(独立作用域、默认严格模式)=================================================
来源:https://www.cnblogs.com/baota/p/12381401.html