模塊化html
將一個複雜的程序 依據必定的規則(規範) 拆分紅幾個塊(文件),並進行組合在一塊兒前端
塊內部的數據是私有的,只是向外暴露一些接口(方法)與外部其餘模塊進行通訊vue
模塊的暴露、模塊的引入node
模塊的進化史jquery
1. 頁面加載 script 的缺點:git
請求過多,依賴模糊,難以維護github
module1.js面試
module2.jsnpm
index.htmlvim
2. 簡單地封裝進一個對象(本質是對象,可修改,不安全)
3. 使用 IIFE 匿名閉包
4. 引入依賴(現代模塊化的基石)
前端面試題: 沒有模塊化,怎麼寫代碼?
利用 IIFE 引入依賴,構建匿名閉包。
設計原則: 高內聚、低耦合(模塊內部配合越緊密越好、模塊之間聯繫越低越好)
解耦: 下降耦合度
模塊化的好處:
避免了命名衝突(減小了命名空間的污染)
更好的分離
更高的複用性
可維護性好
模塊化規範 (vue 的出現,組件規範更深得人心):
因爲目前,瀏覽器還不能直接徹底識別 ES6
Babel 將 ES6 轉成 ES5,還將 import 語法 轉成了 require 語法語法,最後 Browserify 使瀏覽器認識 require 語法
依賴模塊,須要編譯打包處理
1. 分別暴露
export 暴露內容;
2. 統一暴露
export {xxx, yyy};
3. 默認暴露 (使用的頻率很高,只能暴露一次)
export default 暴露內容;
1. import {} from './module1';
2. import modules from './module2';
(瀏覽器端的) 實現:
① 使用 jQuery 的話
npm install jquery@1 --save
import $ from 'jquery';
② 使用 Babel 將 ES6 編譯爲 ES5 代碼 (還能 { "presets": ["jsx"] } )
npm install -g babel-cli browserify // comment line interface ----> 命令行接口
npm install babel-preser-es2015 --save-dev // 安裝進開發依賴
vim .babelrc // run control 運行時控制規則
{ "presets": ["es2015"] }
③ 使用 Babel 將 ES6 編譯爲 ES5 代碼 (ES6 模塊化 轉換成了 CommandJS)
babel js/src -d js/lib
④ 使用 Browserify
browserify js/lib/app.js -o js/lib/appOutput.js
<script scr="js/lib/appOutput.js"></script>
看起來這一系列很麻煩,可是 自動化構建工具 誕生了,哈哈。
使用 Browserify 編譯打包 js
1
1
每個 js 文件均可以當成一個模塊
模塊加載 是運行時同步加載的
npm install uniq --save
暴露模塊 (本質是 exports 對象)
module.exports = {xxx, ccc};
exports.xxx = xxx;
exports.ccc = ccc;
module.js:
module.exports = {
name:'SunWuKong',
age:550,
hello(){ console.log('Hello Module.'); }
};
引入模塊
require('xxx'); // 第三方庫
require('./xxx'); // 自定義模塊,必須以 ./ 或者 ../ 開頭
const sun = require('./module.js');
const {name:sunName} = require('./module.js');
瀏覽器端不認識 require 因此必須 npm install browserify -g // 查看全局的包在哪兒 npm get prefix
模塊須要提早編譯打包處理
npm install browserify -g
browserify js/src/app.js -o js/dist/appOutput.js
<script src="js/dist/appOutput.js"></script>
Asynchronous Module Definition 異步模塊定義
https://github.com/amdjs/amdjs-api/wiki/AMD
專門用於瀏覽器端,模塊的加載是異步的
1. 定義一個沒有依賴的模塊
define(function(){
return 模塊;
});
2. 定義又依賴的模塊
define(['module1', 'module2'... ...], function(m1, m2){... ...}); // 破壞了 就近聲明原則
瀏覽器端,模塊的加載是異步的 :
坑:
去 .js 後綴
jquery 迎合 小寫 jquery