dljia
  • 前言
  • es6
    • promise
    • 箭头函数
  • http相关
    • ajax请求中contentType和dataType
    • async和defer的区别
    • cookie、session和token
    • http协议介绍
    • http缓存
    • 转发和重定向
  • js
    • 1-js深浅复制
    • 10-节流防抖
    • 11-Promise常见手写
    • 2-js函数值传递
    • 3-js原型链详解
    • 4-js基础讲解this篇
    • 5-call、apply和bind
    • 6-js中的继承
    • 7-闭包与立即执行函数
    • 8-js事件循环
    • 9-js模块化
  • react
    • React-diff
    • React-fiber
    • React组件设计规则
    • mvc与mvvm
    • react-router
    • react懒加载
    • redux
    • setState源码分析
    • webpack+react从0项目构建
  • ts
    • Typescript编程书籍导读
    • 体操基础
  • 其他
    • gitbook简易配置教程
    • gitbook转pdf电子书
  • 微前端
    • pnpm
    • qiankun
    • single-spa源码分析
    • 几种微前端架构的选型
  • 转载
    • interview-1
    • interview-2
    • interview-3
    • 经验好文
  • 项目经验
    • 23年总结
    • [Arkts 学习笔记](项目经验/Arkts 学习笔记.md)
    • Grafana插件
    • JSDoc
    • electron-builder构建的安装包,安装时通过nsis脚本自动导入注册表
    • overflow-yautohiddenscroll和overflow-xvisible组合渲染异常
    • webpack
    • 前端工程化
    • 前端性能优化思路
    • 前端性能监控工具
    • 前端架构
    • 前端登录流程
    • 前端监控原理
    • 团队管理
    • 基于node实现简单server
    • 如何对业务进行深挖
    • 如何拉齐横向
    • 如何画图
    • 如何记录
    • 组件库
Powered by GitBook
On this page

Was this helpful?

  1. js

9-js模块化

Previous8-js事件循环Nextreact

Last updated 1 year ago

Was this helpful?

前端模块化分几种:CommonJS、ES6、AMD、CMD、UMD

BTW,组件库打包比如antd 打包出来的文件目录比如lib es dist 分别是common.js esmodule umd 模块

  1. CommonJS CommonJS 采用的是运行时同步加载,模块输出的是一个值的拷贝。 针对为什么CommonJS是运行时同步加载:阮一峰老师有着很好的解释

是因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成

主要API

  • module对象 Node内部提供一个Module构建函数。所有模块都是Module的实例 每个模块内部,都有一个module对象,代表当前模块。它有以下属性

    • module.id 模块的识别符,通常是带有绝对路径的模块文件名。

    • module.filename 模块的文件名,带有绝对路径。

    • module.loaded 返回一个布尔值,表示模块是否已经完成加载。

    • module.parent 返回一个对象,表示调用该模块的模块。

    • module.children 返回一个数组,表示该模块要用到的其他模块。

    • module.exports 表示模块对外输出的值,其他文件加载该模块,实际上就是读取module.exports变量。

  • exports变量 为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令var exports = module.exports。很明显这里会涉及到对象的引用问题。所以实际开发中尽量避免使用exports变量

  • require 引用module.exports导出的整个变量

  1. ES6 ES6模块化采用的是编译时输出接口,提供的是值的引用 主要API: export命令用于规定模块的对外接口,export可以定义再文件的任何一个位置中 例如:export var a = 2 此时 我们可以使用import 命令进行接收 形如:import {a as b} form '路径'。其中大括号中的变量名必须与导出的名字相一致,as 后是可以使用别名。 也可以用export default b = 3来导出默认的一个值,这样使用import命令时就无须记住变量名,形如import a from '路径'

  2. AMD 是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。由于是异步 所以更适合浏览器环境,他比较强调的是依赖前置 语法为:require([module], callback);define([module],callback) 主要实现库为require.js

  3. CMD 推崇依赖就近,只有真正需要才加载,只有使用的时候才定义依赖。没什么用了解即可

  4. UMD 推出时间大约在 2013 年。UMD 主要是解决跨平台模块化方案的问题,它合并了 CommonJS 和 AMD 规范,能够兼容各种情况的环境,同时运行在客户端和服务器端,因此被称为是通用的模块定义。当使用 Rollup/Webpack 之类的打包器时,UMD 通常用作备用模块

    (function (root, factory) {
    if (typeof define === "function" && define.amd) {
    	define(["dependency"], factory);
    } else if (typeof exports === "object") {
    	module.exports = factory(require("dependency"));
    } else {
    	root.returnExports = factory(root.dependency);
    }
    })(this, function (dependency) {
    return {}; //返回值即为定义的模块
    });
    

    注:所以说single-spa 子模块可以设置为amd也是可以的。核心是要的导入加载。

参考文章

AMD
阮一峰-ECMAScript 6 入门
CommonJS规范
前端模块化:CommonJS,AMD,CMD,ES6