webpack學(xué)習(xí)筆記之代碼分割和按需加載的實(shí)例詳解
本文介紹了webpack學(xué)習(xí)筆記之代碼分割和按需加載的實(shí)例詳解,分享給大家,也給自己留個(gè)筆記
為什么需要代碼分割和按需加載
代碼分割就是我們根據(jù)實(shí)際業(yè)務(wù)需求將代碼進(jìn)行分割,然后在合適的時(shí)候在將其加載進(jìn)入文檔中。
舉個(gè)簡單的例子:
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語法。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文件,大概長這樣:
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í)以來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ù)
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)Fly Bird小游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)Fly Bird小游戲的制作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12經(jīng)典的間隔時(shí)間滾動(dòng)新聞(圖片),可控制滾動(dòng)
經(jīng)典的間隔時(shí)間滾動(dòng)新聞(圖片),可控制滾動(dòng) 其實(shí)這個(gè)也挺多網(wǎng)站用到的,簡單又實(shí)用。(2010-05-05原生JS實(shí)現(xiàn)$.param() 函數(shù)的方法
這篇文章主要介紹了原生JS實(shí)現(xiàn)$.param() 函數(shù)的方法,由于遇到相關(guān)序列化的問題,但是vue項(xiàng)目中由于減少隊(duì)jquery引用的限制,導(dǎo)致不能用$.param來序列化參數(shù),下面小編給大家分享了實(shí)例代碼,需要的朋友參考下吧2018-08-08讓插入到 innerHTML 中的 script 跑起來的實(shí)現(xiàn)代碼
在做 ajax 編程時(shí),我們常常需要將 xmlhttp 獲取到的頁面內(nèi)容通過 innerHTML 來賦給某個(gè)容器(比如 div、span 或者 td 等),但是這里存在一個(gè)問題,就是我們將要賦給 innerHTML 的頁面內(nèi)容如果包含有腳本程序,這些腳本程序不管是外部腳本,還是內(nèi)部腳本,可能(1)都不會(huì)被執(zhí)行。2006-07-07javascript解析json格式的數(shù)據(jù)方法詳解
這篇文章主要介紹了javascript解析json格式的數(shù)據(jù)方法詳解,文章通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08原生JS實(shí)現(xiàn)列表內(nèi)容自動(dòng)向上滾動(dòng)效果
這篇文章主要介紹了原生JS實(shí)現(xiàn)列表內(nèi)容自動(dòng)向上滾動(dòng)效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05前端JavaScript處理小數(shù)精度問題的最佳實(shí)踐教程
在JavaScript開發(fā)過程中,小數(shù)精度問題是一個(gè)常見的難題,本文介紹了兩種解決小數(shù)精度問題的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10原型方法的不同寫法居然會(huì)影響調(diào)試的解決方法
原型方法的不同寫法居然會(huì)影響調(diào)試的解決方法...2007-03-03微信小程序中做用戶登錄與登錄態(tài)維護(hù)的實(shí)現(xiàn)詳解
微信小程序的運(yùn)行環(huán)境不是在瀏覽器下運(yùn)行的。所以不能以cookie來維護(hù)登錄態(tài)。下面這篇文章主要給大家介紹了微信小程序中如何做用戶登錄與登錄態(tài)維護(hù)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí)。2017-05-05