Web前端模塊化

普通模塊化:

模塊1 aa.js:
(function (w) {
    var msg = '我是aa.js中的  msg';

    function getMsg() {
        console.log(msg);
    }

    w.aa = {getMsg};
})(window);
模塊2 bb.js
(function (w, a) {
    var msg = '我是bb.js中的 msg';

    function getMsg() {
        console.log(msg);
        a.getMsg();
    }

    w.bb = {getMsg: getMsg};
})(window, aa);
主文件 app.js
(function (b) {
    b.getMsg();
})(bb);
index.html文件中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="aa.js"></script>
<script src="bb.js"></script>
<script src="app.js"></script>
</body>
</html>

缺點(diǎn):全局變量污染、html中引入需要順序

CommonJs規(guī)范

1、 基于node的服務(wù)端:

模塊1 module1.js
exports.foo = function () {
    console.log('這是module1模塊的 foo函數(shù)')
};
exports.bar = function () {
    console.log('這是module1模塊的 bar函數(shù)')
};
模塊2 module2.js
module.exports = {
    username: '張三',
    say() {
        console.log('我是module2模塊的say方法')
    }
};
主文件  app.js
var m1 = require('./modules/module1');
var m2 = require('./modules/module2');

m1.foo();
m1.bar();

console.log(m2.username);
m2.say();

運(yùn)行  node app.js 

2、瀏覽器端:瀏覽器不能識(shí)別CommonJs中的語法,所以需要Browserify 用來編譯打包

  創(chuàng)建 src目錄(開發(fā)源代碼文件夾)  和  dist目錄(打包后的生產(chǎn)文件夾)

  下載 全局安裝 npm install browserify -g

          本地安裝:npm install browserify --D

   運(yùn)行  browserify  js/src/app.js  -o  js/dist/bundle.js

    然后在index.html中引入 dist/bundle.js文件即可

AMD規(guī)范:

依賴于 requirejs 
下載 requirejs并放在libs文件夾下
專門用于瀏覽器端的規(guī)范,加載模塊是異步
定義模塊 用define()    
引入使用模塊用 requirejs()
模塊1 aa.js
define(function () {
    var msg = 'aa中的msg';
    function shown() {
        return msg;
    }
    return {shown};
});
模塊2  bb.js
define(['aa'], function (a) {
    var s = 'hello';

    function showMsg() {
        console.log(s, a.shown());
    }

    return {showMsg};
});
主文件  main.js
requirejs.config(
    {
        baseUrl: 'js/',//以下路徑都是基于本路徑
        paths: {//每個(gè)模塊的定義
            aa: './modules/aa',
            bb: './modules/bb',
            jquery: './libs/jquery-3.4.1.min'//jquery模塊支持amd規(guī)范,但只可以小寫
        }
    }
);
requirejs(['bb', 'jquery'], function (b, $) {
    b.showMsg();
    $('body').css('backgroundColor', 'red');
});

index.html中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script data-main="./js/main.js" src="./js/libs/require.js"></script> //引入文件
</body>
</html>

CMD:

http://caibaojian.com/cmd-cn.html](http://caibaojian.com/cmd-cn.html

ES6規(guī)范:

因現(xiàn)在很多瀏覽器依然不能識(shí)別es6語法,所以需要編譯成瀏覽器都可識(shí)別的es5的語法,用 babel 編譯器

babel:是JavaScript編譯器,主要是用于將es2015( es6 )以上版本的語法,轉(zhuǎn)換成es5的語法,來兼容瀏覽器

babel安裝:1、babel-cli( cli :command line interface,若想要使用 babel的命令,則必須安裝 babel-cli )

                         npm install babel-cli -g ( 需要全局安裝 ) 

                         babel -v 可以返回版本就證明babel安裝成功了

                    2、babel-preset-es2015 ( preset-預(yù)設(shè),代表將babel中用于轉(zhuǎn)換es6到es5的所有工具打包下載下來 )  

                         npm install babel-preset-es2015 -D 

         配置 :根目錄下創(chuàng)建  .babelrc 文件 ( rc 代表 run control,表示這是運(yùn)行時(shí)控制文件,既運(yùn)行時(shí)需要讀的文件 ),

         .babelrc文件中配置    { " presets " : [ " es2015 " ] }     

導(dǎo)出:

     常規(guī)導(dǎo)出方式:export function fn(){ -----   }   export var as = ' ' ; 

     默認(rèn)導(dǎo)出方式:export default function(){ ----- }  

導(dǎo)入:

   常規(guī)導(dǎo)出的接收方式:import { a, b } from ' ./modules/modules1 '

  默認(rèn)導(dǎo)出的接收方式:import module3 from ' ./modules/modules2 '

運(yùn)行代碼去轉(zhuǎn)換成 babel ./js/src -d ./js/build ( 將src文件夾下所有文件轉(zhuǎn)換成es5語法 )

此時(shí) 仍不可直接引用,會(huì)報(bào)錯(cuò)找不到 require,這是因?yàn)闉g覽器不能識(shí)別Commonjs語法,此時(shí)需要 browserify

  npm install browserify -g  
  npm install browserify -D
     browserify  ./js/build/main.js  -o  ./js/dist/bundle.js
     ( 將轉(zhuǎn)換后的main.js文件編譯成瀏覽器可識(shí)別的bundle.js文件)
    此時(shí) 方可在index.html中引用 dist/bubdle.js 文件了  
    <script src=" ./js/dist/bundle.js ''></script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容