JavaScript模块化编程是指将JavaScript代码分割成独立的模块,每个模块都有自己的作用域和接口,可以按需加载和使用。这样可以避免全局变量污染,提高代码的可维护性和可重用性。在ES6之前,JavaScript并没有一个统一的模块化规范,开发人员通常使用CommonJS或AMD等第三方库来实现模块化编程。
从四个维度来分析下js模块化,同步异步加载、变量的深浅拷贝、适用范围、代码表现。
针对于深浅拷贝来说,module.exports+require这样的操作就是浅拷贝可以共享内存,对于export import这样的操作就是深拷贝这个可以看之前的博客。
使用了rollup打包了umd。
同步异步加载:同步
适用范围:nodejs
代码表现:
- // a.js
- module.exports = {
- boo: 10
- }
-
- // b.js
- const {boo} = require('a.js')
- console.log(boo)
同步异步加载::异步
适用范围:nodejs、配合reqirejs可以在浏览器中使用
代码表现:参考umd代码
define(["exports"], factory);
同步异步加载:同步
适用范围:nodejs和配合reqirejs可以在浏览器中使用
代码表现:参考umd代码
- define(function(require, exports, module) {
- exports.a = 10
- factory(exports);
- });
同步异步加载:同步
适用范围:nodejs和浏览器
代码表现:兼容了commonjs、cmd、amd
- (function (global, factory) {
- if (typeof exports === "object" && typeof module !== "undefined") {
- // commonjs
- factory(exports);
- } else if (typeof define === "function" && define.amd) {
- // amd
- define(["exports"], factory);
- } else if (typeof define === "function" && define.cmd) {
- // cmd
- define(function(require, exports, module) {
- exports.a = 10
- factory(exports);
- });
- } else {
- // 没有环境
- (global = typeof globalThis !== "undefined" ? globalThis : global || self),
- factory((global.umd = {}));
- }
- })(this, function (exports) {
- "use strict";
-
- console.log(3424221233);
- var sum = function sum(a, b) {};
-
- exports.sum = sum;
-
- Object.defineProperty(exports, "__esModule", { value: true });
- });
同步异步加载:异步
适用范围:浏览器(随着浏览器的发展,可以在script的标签中加入type="module"来支持)和nodejs(Node verison 13.2.0,有两种方式1:package.json中填写type: "modules",2.将文件结尾命名为mjs)
代码表现:
- // a.js
- let boo = 10
- export default boo
-
- // b.js
- import boo from "boo"
- console.loG(boo)
同步异步加载:同步
适用范围:nodejs和浏览器
代码表现:
- (function() {
- var foo = "bar";
- console.log(foo);
- })();
在webpack、rollup、esm各种打包器中都可以设置对应的产物类型,我们要根据我们的产物的用途来选择对应的类型,我们一般并不会关心最终的代码产物,但是对于各种类型的产物还是要有一定的了解,这篇文章算是个简单的总结。
鹰眼:悲哀的弱者,如果你真是一流的剑士,就算没跟我交手也明白你我实力的差距吧