webpack學(xué)習(xí)筆記之代碼分割和按需加載的實(shí)例詳解
本文介紹了webpack學(xué)習(xí)筆記之代碼分割和按需加載的實(shí)例詳解,分享給大家,也給自己留個(gè)筆記
為什么需要代碼分割和按需加載
代碼分割就是我們根據(jù)實(shí)際業(yè)務(wù)需求將代碼進(jìn)行分割,然后在合適的時(shí)候在將其加載進(jìn)入文檔中。
舉個(gè)簡(jiǎn)單的例子:
1.一個(gè)HTML中存在一個(gè)按鈕
2.點(diǎn)擊按鈕出現(xiàn)一個(gè)包著圖片的div
3.點(diǎn)擊關(guān)閉按鈕圖片消失
Demo目錄:

一.當(dāng)未點(diǎn)擊按鈕時(shí)瀏覽器只加載了對(duì)入口文件打包后的js

二.點(diǎn)擊按鈕會(huì)對(duì)組件進(jìn)行異步加載

這個(gè)clichunk就是我們打包好的click組件,包括相應(yīng)的JS邏輯html和css
例子源碼記錄
1.編輯入口文件
window.onload=function(){
var _cs=require('./index.css');
var $=require('jquery');
$('#_click').on('click',function(){
require.ensure([],function(require){
var _click=require('./_clickWindow.js');
if(!_clickEvent){
console.log(_click);
var _clickEvent=_click._clicks;
}
new _clickEvent();
},'cli')
});
};
webpack將一切視為模塊,CSS,js,html,JSX等等。
var _cs=require('./index.css');
引入對(duì)應(yīng)的css模塊。這就需要我們安裝css-loder和style-loader。
–save -dev的目的是為了在package.json文件的devDependencies寫入依賴項(xiàng)。
點(diǎn)擊按鈕時(shí),加載定義好的組件,當(dāng)加載完成后執(zhí)行組件里的方法。
首先要學(xué)習(xí)require.ensure方法:
在commonjs中有一個(gè)Modules/Async/A規(guī)范,里面定義了require.ensure語(yǔ)法。webpack實(shí)現(xiàn)了它,作用是可以在打包的時(shí)候進(jìn)行代碼分片,并異步加載分片后的代碼。用法如下:
require.ensure([], function(require){
var list = require('./list');
list.show();
});
中括號(hào)內(nèi)寫入依賴項(xiàng)
此時(shí)list.js會(huì)被打包成一個(gè)單獨(dú)的chunk文件,大概長(zhǎng)這樣:
1.fb874860b35831bc96a8.js。
可讀性比較差,此時(shí)就需要加入第三個(gè)參數(shù)
require.ensure([], function(require){
var list = require('./list');
list.show();
}, 'list');
此時(shí)打包后的js文件名為
list.fb874860b35831bc96a8.js
也可以傳入像”question/list”這樣帶層級(jí)的名字,這樣webpack會(huì)按照層級(jí)給你創(chuàng)建文件夾。
require.ensure([], function(require){
var list = require('./list');
list.show();
var edit = require('./edit');
edit.display();
}, 'list_and_edit');
同時(shí)引入兩個(gè)文件,webpack會(huì)將這兩個(gè)文件和寫入的依賴項(xiàng)打包在一起,如果你不希望打包在一起,只能寫兩require.ensure分別引用這兩個(gè)文件。
require.ensure([‘./a.js'], function(require){
var list = require('./list');
list.show();
});
require.ensure([‘./a.js'], function(require){
var b = require('./b');
b.show();
});
如果list和b同時(shí)以來(lái)a.js那么在打包時(shí)a.js會(huì)被重復(fù)打包兩次,如果想解決這樣的問題,那么
require.ensure([‘./a.js'], function(require){
var list = require('./list');
list.show();
},'list-b');
require.ensure([‘./a.js'], function(require){
var b = require('./b');
b.show();
},'list-b');
此時(shí)這三個(gè)文件就會(huì)被打包在一起。
2.組件js
(function(){
var _html=require('./_clickHtml.html');
var $=require('jquery');
function ClickWindow(){
this.div=$('body').append(_html);
$('#_tip').append('<img src="./timg.jpg">');
this.init();
}
ClickWindow.prototype.init=function(){
$('#_tip').append('<button>關(guān)閉</button>')
.on('click',function(){
$('img').animate({'width':0},300);
});
};
module.exports._clicks=ClickWindow;
})();
引入寫好的html同上需要下載html-loader
3.配置文件
var path=require('path');
module.exports={
entry:__dirname+'/index.js',
output:{
path: __dirname,
filename:'[name]bundle.js',
chunkFilename:'[name]chunk.js'
},
module: {
loaders: [ //加載器
{test: /\.css$/, loader: "style!css" },
{test: /\.html$/, loader: "html" },
{test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'}
]
}
};
filename:'[name]bundle.js',
[name]指向入口文件的name
chunkFilename:'[name]chunk.js'
[name]指向require.ensure定義的第三個(gè)參數(shù)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS使用tofixed與round處理數(shù)據(jù)四舍五入的區(qū)別
js中一般使用tofixed與round處理數(shù)據(jù)四舍五入,那么tofixed與round有什么區(qū)別呢?下面小編給大家分享JS使用tofixed與round處理數(shù)據(jù)四舍五入的區(qū)別,需要的朋友參考下吧2017-10-10
深入學(xué)習(xí)js函數(shù)的隱式參數(shù) arguments 和 this
這篇文章主要介紹了 深入學(xué)習(xí)js函數(shù)的隱式參數(shù) arguments 和 this,arguments是一個(gè)類數(shù)組結(jié)構(gòu),它保存了調(diào)用時(shí)傳遞給函數(shù)的所有實(shí)參;this是函數(shù)執(zhí)行時(shí)的上下文對(duì)象, 這個(gè)對(duì)象有些讓人感到困惑的行為。 下面分別對(duì)他們進(jìn)行討論。,需要的朋友可以參考下2019-06-06
微信小程序websocket實(shí)現(xiàn)聊天功能
這篇文章主要為大家詳細(xì)介紹了微信小程序websocket實(shí)現(xiàn)聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
jquery單行文字向上滾動(dòng)效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了jquery單行文字向上滾動(dòng)效果的具體實(shí)現(xiàn),此效果適應(yīng)于很多場(chǎng)景,會(huì)的不會(huì)的都要學(xué)習(xí)下啊2014-09-09
JavaScript1.6數(shù)組新特性介紹以及JQuery的幾個(gè)工具方法
這篇文章主要是對(duì)JavaScript1.6數(shù)組新特性以及JQuery的幾個(gè)工具方法進(jìn)行了介紹,需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
js 點(diǎn)擊頁(yè)面其他地方關(guān)閉彈出層(示例代碼)
本篇文章主要介紹了js點(diǎn)擊頁(yè)面其他地方關(guān)閉彈出層的示例代碼。需要的朋友可以過來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
基于Bootstrap table組件實(shí)現(xiàn)多層表頭的實(shí)例代碼
Bootstrap table還有一個(gè)很多強(qiáng)大的功能,下面就通過本文給大家分享基于Bootstrap table組件實(shí)現(xiàn)多層表頭的實(shí)例代碼,需要的朋友參考下吧2017-09-09

