摘要:代碼地址模塊化的主要區別此前年前前前前前端模塊化,主流的就是,支持的二者都可以用為什么模塊化一直以來,前端開發的痛點之一就是代碼復用職責劃分問題,兼容性比如等新語法的支持組件化代碼壓縮等不在本文討論范圍。
前言
請注意,現在是2019/05/22,這!不!是!墳!貼!,你沒!有!穿!越!!
為了以后,可能需要搞一下以前的舊項目,自己也想玩玩,,,所以補一下舊時代的模塊化玩法。。。
代碼:github地址
AMD/CMD/Common.js/UMD/ES6模塊化的主要區別此前(2019年前前前前)前端模塊化,主流的就是AMD/CommonJS,支持UMD的二者都可以用
為什么模塊化?
一直以來,前端開發的痛點之一就是 代碼復用/職責劃分 問題,兼容性比如ES6等新語法的支持/組件化/代碼壓縮等不在本文討論范圍。
在這些 前端模塊化 的東西出現之前,都是用標簽引入js,如果每個頁面都 按模塊劃分 (比如所有變量方法都放在一個對象里面)就不會造成全局變量污染,但是各種 js/模塊 的依賴關系就不明確了,而且有些暫時用不到的js,又會先下載,影響頁面加載速度。
同步:CMD/CommonJS/ES6import
異步:AMD/CMDrequire.async
靜態:編譯時執行;AMD/ES6import,
動態:運行時執行;CMD/CommonJS/ES6+ import()
瀏覽器:AMD/CMD,ES6模塊化目前瀏覽器還不能原生支持,需要使用webpack/babel等編譯成瀏覽器支持的版本
服務器:CommonJS:Node.js使用的模塊化規范
支持AMD/CommonJS的統一規范,使用UMD定義的模塊,可以支持AMD和CommonJS
支持UMD的庫可以在 AMD/CommonJS 上使用,CMD在這方面就稍微差一點;
喜歡CommonJS模塊寫法的,CMD倒是個不錯的選擇
一、AMD/require.js 什么是AMD?AMD: Asynchronous Module Definition,中文名是 異步模塊定義 的意思
依賴前置,define的時候就引入,然后作為回調函數的參數使用
第三方庫支持較多,相對的CMD支持的就比較少,如這里使用的 lodash.js 庫(或者我沒配置對。。。)
使用 return 的方式導出
以下使用require.js v2.3.6示例:
目錄結構:
... equire.js-AMD ├─ index.html ├─ js ├─ lodash.js ├─ m1.js └─ m2.js ├─ main.js └─ require.jsHTML
<script src="./require.js" data-main="./main.js">script>
入口 main.js
// js/mian.js
// 全局配置
require.config({
// 根路徑設置,paths下面全部都是根據baseUrl的路徑去設置
baseUrl:"./js",
paths: { // 定義引用時名稱對應的路徑
m1: "m1",
m2: "m2",
lodash: "lodash"
},
// 用來配置不兼容的模塊,沒有module.exports的第三方庫(未驗證。。。)
// shim:{
// "lodash": {
// exports: "_"
// }
// }
})
define("main", function() {
require(["m1"], function(m1) {
console.log("name: ", m1.name);
console.log("add: ", m1.add(2, 8));
});
})
模塊定義
define函數格式: define(id");
// js/m1.js
// define(id");
define("m1", ["lodash", "m2"], function(_, m2) {
_.map([1,2], function(num){
console.log("num: ", num);
});
console.log(m2);
var add = function(x, y) {
return x + y;
};
return {
name: "m1.js",
add: add
};
})
二、CMD/sea.js
在瀏覽器端的CommonJS(除去某些Node.js環境特有的API);同步、動態加載;
依賴就近,哪里需要哪里require;
異步引入 require.async([dependencies], callback);
使用 exports/module.exports 方式導出
以下使用sea.js v3.0.0示例:
目錄結構:
...sea.js--CMD ├─ index.html ├─ js ├─ lodash.js ├─ m1.js └─ m2.js ├─ main.js └─ sea.jsHTML
<script src="./js/lodash.js">script>
<script src="./sea.js">script>
<script>
// 配置
seajs.config({
base: "./", // 后續引用基于此路徑
alias: { // 別名,可以用一個名稱 替代路徑(基于base路徑)
lodash: "js/lodash.js",
m1: "js/m1",
m2: "js/m2",
},
});
// 加載入口模塊
seajs.use("./main.js", function(main) {
// 執行完 main.js導出(exports/module.exports)之前的同步操作之后的 回調
main.init(); // init
});
script>
入口 main.js
// js/mian.js
define(function(require, exports, module) {
var m1 = require("m1");
console.log(m1.add(2,8));
// 多帶帶導出
exports.init = function init() {
console.log("init");
}
// 或者 先定義,再統一導出
// function init() {
// console.log("init");
// }
// module.exports = {
// init: init
// }
});
模塊定義
define函數格式: define(function(require, exports, module) {})
// js/m1.js
define(function(require, exports, module) {
// 使用第三方庫 lodash.js,script標簽導入
// 優先require,不然使用script
_.map([1,2], function(item) {
console.log(item);
})
// 異步引入
require.async("m2", function(m2) {
console.log("異步引入 m2");
}); // m2
// 每個函數多帶帶導出
exports.add = function(x, y) {
return x + y;
}
// 或者 先定義,再統一導出
// function add(x, y) {
// return x + y;
// }
// modules.exports = {
// add: add
// }
});
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/6879.html
摘要:中使用操作符具體做了哪些事情創建了一個空對象空對象的屬性指向構造函數的屬性執行構造函數,將的指向前端面試題及答案瀏覽器篇前端面試題及答案篇前端面試題及答案篇前端面試題及答案性能優化篇 這篇文章并不是最全的前端面試題(沒有最全,只有更全),只是針對自己面試過程中遇到的一些難題、容易忽略的題做一個簡單的筆記,方便后面有面試需要的小伙伴們借鑒,后續內容會不定時更新,有錯誤之處希望大家不吝指出...
摘要:第二行,在第一行之后運行,因此必須等加載完成。類似于,但是是依賴就近,延遲執行,是依賴前置,提前執行。是一個文件名重命名導入成員名稱標識符從已經存在的模塊腳本文件等導入返回一個對象。 前言 JS模塊化編程是前端小伙伴們必不可少的知識,下面妹子將于自認為比較清晰的方式列舉出來。 1 require 特點: 1.運行時加載 2.拷貝到本頁面 3.全部引入 1.1 CommonJS No...
摘要:所以說的模塊機制沒有解決文件依賴關系和文件異步加載的問題。大部分團隊還是停留在第二第三階段,每個階段的實現都有很多種選擇。希望這篇文章能夠激起大家永遠保持積極向前追求完美代碼的心,不僅對自己的成長也會對公司帶來無限的價值。 本篇技術博客來自有著化腐朽為神奇能力的,Worktile 技術牛人Web 總監 @徐海峰 大神的分享~滿滿的干貨,你值得擁有! Worktile 的前端構建之路 2...
閱讀 1308·2021-11-15 11:37
閱讀 3500·2021-11-11 16:55
閱讀 1747·2021-08-25 09:39
閱讀 3214·2019-08-30 15:44
閱讀 1733·2019-08-29 12:52
閱讀 1404·2019-08-29 11:10
閱讀 3237·2019-08-26 11:32
閱讀 3220·2019-08-26 10:16