摘要:在開發(fā)的時候會時常用到第三方的庫或者框架,比如耳熟能詳?shù)?。使用第三方庫在入口文件當中直接?dǎo)入安裝目錄結(jié)構(gòu)如圖內(nèi)容如下內(nèi)容如下陳學輝內(nèi)容如下這是自帶的內(nèi)容如下內(nèi)容如下引入后打開頁面會看到最后一個標簽有了一個綠色的背景。
在開發(fā)的時候會時常用到第三方的庫或者框架,比如耳熟能詳?shù)?b>jquery。借助它們能提高開發(fā)效率,但是如何在webpack中使用呢。這篇文章介紹兩個東西,如何使用第三方庫以及如何提取第三方庫。
使用第三方庫 1、在入口文件當中直接導(dǎo)入安裝jQuery
npm i jquery -S
目錄結(jié)構(gòu)如圖:
package.json內(nèi)容如下:
{ "name": "webpack-demo", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "build": "webpack --mode production", "dev": "webpack-dev-server --mode development" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "css-loader": "^1.0.0", "file-loader": "^1.1.11", "html-webpack-plugin": "^3.2.0", "mini-css-extract-plugin": "^0.4.1", "url-loader": "^1.0.1", "webpack": "^4.16.3", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.1.5" }, "dependencies": { "jquery": "^3.3.1" } }
webpack.config.js內(nèi)容如下:
const path=require("path"); const HtmlWebpackPlugin=require("html-webpack-plugin"); const MiniCssExtractPlugin=require("mini-css-extract-plugin"); module.exports={ entry:"./src/js/index.js", output:{ path:path.resolve(__dirname,"dist"), filename:"js/index.js" }, plugins:[ new HtmlWebpackPlugin({ title:"陳學輝", template:"./src/template.html", filename:"index.html" }), new MiniCssExtractPlugin({ filename:"css/index.css" }), ], devServer:{ host:"localhost", port:1573, open:true }, module:{ rules:[ { test:/.css$/, use:[ { loader:MiniCssExtractPlugin.loader, options:{ publicPath:"../" } }, "css-loader", ] }, { test:/.(jpg|png|gif)$/, use:[ { loader:"url-loader", options:{ limit:5 * 1024, outputPath:"images" } } ] } ] } }
templage.html內(nèi)容如下:
<%= htmlWebpackPlugin.options.title %>
index.css內(nèi)容如下:
#box{ width: 800px; height: 500px; border: 5px solid #999; color: #00f; background: url(../images/img_01.jpg); }
index.js內(nèi)容如下:
import "../css/index.css"; import $ from "jquery"; //引入jquery $("ul li:last-child").css("background","green");
npm run build后打開頁面會看到最后一個li標簽有了一個綠色的背景。如果你打開index.js文件后會發(fā)現(xiàn)jquery的代碼也被壓縮了進來。
這是引入第三方庫的一種方式,但這種方式會有一個問題,如果我僅僅只是引入而并沒有使用,在打包的時候依然會把第三方庫打包進來。如果你的代碼由第二位同學接手,他為了避免出錯并不會直接把import刪掉,而會把使用這個庫的代碼刪掉,假如這個庫的代碼只剩下了import,那打包后的文件體積依然很大,便是一種浪費
修改index.js如下:
import "../css/index.css"; import $ from "jquery"; //引入jquery //$("ul li:last-child").css("background","green");
npm run build后打開index.js,你會發(fā)現(xiàn)jquery的代碼依然被打包了
2、webpack.ProvidePlugin自動加載模塊,而不必用import或require
如果加載的模塊沒有使用,則不會被打包
加載的模塊為全局模塊,在全局都可以使用
修改webpack.config.js如下:
const path=require("path"); const HtmlWebpackPlugin=require("html-webpack-plugin"); const MiniCssExtractPlugin=require("mini-css-extract-plugin"); const webpack=require("webpack"); //引入webpack模塊,ProvidePlugin是webpack身上的一個插件 module.exports={ entry:"./src/js/index.js", output:{ path:path.resolve(__dirname,"dist"), filename:"js/index.js" }, plugins:[ new HtmlWebpackPlugin({ title:"陳學輝", template:"./src/template.html", filename:"index.html" }), new MiniCssExtractPlugin({ filename:"css/index.css" }), new webpack.ProvidePlugin({ //它是一個插件,所以需要按插件的用法new一個 $:"jquery", //接收名字:模塊名 }), ], devServer:{ host:"localhost", port:1573, open:true } ...
修改index.js內(nèi)容如下:
import "../css/index.css"; $("ul li:last-child").css("background","green");
npm run build后打開index.html可以看到一樣的效果
再次修改index.js內(nèi)容如下:
import "../css/index.css"; //$("ul li:last-child").css("background","green");
npm run build后打開index.js可以看到jquery的內(nèi)容并沒有被打包進來。這種方式比上一種方式就智能的很,會根據(jù)你是否使用庫而決定是否打包。
提取第三方庫對于提取第三方庫有兩種形式,第一種是在一個頁面里引入了多個庫,最終所有的代碼都會打包到一個文件里,如果引入的庫非常之多,那文件會非常大,不利于加載。第二種就是在多個頁面里都引入了同一個庫,那會把這個庫打包多次,造成資源浪費。所以就需要把第三方庫多帶帶提取出來,優(yōu)化資源。
1、一個頁面引入多個庫接著上面的代碼,再添加一個庫,這個庫的名字叫underscore,它里面封裝了很多關(guān)于數(shù)組與對象的方法,我拿其中一個方法進行演示
npm i underscore -S
修改webpack.config.js里的插件:
new webpack.ProvidePlugin({ //它是一個插件,所以需要按插件的用法new一個 $:"jquery", //接收名字:模塊名 _:"underscore" //引入underscore庫 }),
修改index.js如下
import "../css/index.css"; $("ul li:last-child").css("background","green"); console.log(_([1,2,3]).map(v=>v*3)); //使用underscore庫里的map方法,此方法為循環(huán)數(shù)組里每一位數(shù)據(jù),并把每位數(shù)據(jù)都乘以3,返回新數(shù)組
npm run build后打開index.html能看到控制臺有輸出了[3, 6, 9],說明underscore庫已經(jīng)被打包到index.js里。可以分別注釋jquery與underscore的使用代碼,npm run build后對比index.js的大小就能看出區(qū)別
提取第三方庫optimization 優(yōu)化
splitChunks 緩存組
能被提取的條件
1、模塊被重復(fù)引用或者來自node_modules中的模塊 2、模塊壓縮前至少有30kb 3、按需(異步)請求的數(shù)量小于5個 4、初始化加載時,并行請求數(shù)量小于等于3
修改webpack.config.js里的moudle.exports
module.exports={ entry:{ index:"./src/js/index.js", //要把入口文件與第三方庫分開,所以要多帶帶的給名字 }, output:{ path:path.resolve(__dirname,"dist"), filename:"js/[name].js" //以key做為輸出的名字 }, plugins:[ //... new webpack.ProvidePlugin({ $:"jquery", _:"underscore" }), ], devServer:{ //... }, module:{ //... }, optimization:{ //優(yōu)化 splitChunks:{ cacheGroups:{//緩存組,一個對象。它的作用在于,可以對不同的文件做不同的處理 commonjs:{ name:"vender", //輸出的名字(提出來的第三方庫) test: /.js/, //通過條件找到要提取的文件 chunks:"initial" //只對入口文件進行處理 } } } } }
npm run build之后有兩個文件,index.js與vender.js,其中vender.js里放的就是jquery與underscore的代碼。
說明:
optimization是webpack的另一個配置參數(shù),它的意義在于優(yōu)化。里面的splitChunks參數(shù)值用來放提取第三方庫的一些設(shè)置,比如:要提取同步還是異步的模塊,這個模塊的引用次數(shù)達到多少能被提取等。但是放在這里的參數(shù)會對所有要提取的模塊生效。如果不同的公共模塊要不同的對待的話就需要在splitChunks.cacheGroups里去定義
cacheGroups翻譯過來就是緩存組,可以理解為針對不同的要提取的公共部分進行多帶帶設(shè)置,比如上面例子中要針對js進行提取,所以就起了個名字叫commonjs,那它是個對象,里面放的就是多帶帶的配置參數(shù)
詳細說明請參考:https://webpack.js.org/plugin...
2、多個頁面同時引入一個庫還有另一種形式,像jquery,它在多個頁面里都被引入了,因為打包只能針對單頁面進行打包,那就會在每個頁面里都打包一次jquery,造成資源浪費
新建a.js與b.js,內(nèi)容如下:
a.js
import $ from "jquery"; console.log("這是a.js"); console.log($("ul"));
b.js
import $ from "jquery"; console.log("這是b.js"); console.log($("ul li"));
可以看到兩個js文件都引入了jquery文件
修改webpack.config.js文件的module.exports
module.exports={ entry:{ a:"./src/js/a.js", b:"./src/js/b.js" }, output:{ path:path.resolve(__dirname,"dist"), filename:"js/[name].js" }, plugins:[ //需要兩個頁面,所以寫兩個new HtmlWebpackPlugin /*new HtmlWebpackPlugin({ title:"陳學輝", template:"./src/template.html", filename:"index.html" }),*/ new HtmlWebpackPlugin({ title:"a頁面", template:"./src/template.html", filename:"a.html", chunks:["a"], //引入對應(yīng)的js,需要用到chunks }), new HtmlWebpackPlugin({ title:"b頁面", template:"./src/template.html", filename:"b.html", chunks:["b"], }), new MiniCssExtractPlugin({ filename:"css/index.css" }), //jquery已經(jīng)多帶帶在a與b文件里引入了,這里就不需要了 /*new webpack.ProvidePlugin({ $:"jquery", //接收名字:模塊名 _:"underscore" }),*/ ], devServer:{ //... }, module:{ //... }, }
npm run build后結(jié)構(gòu)如下圖,在dist下的js目錄里分別看一下a.js與b.js的大小,這兩個文件里都包含了jquery。再分別打開a.html與b.html頁面正常運行,控制臺里打印出了想要的內(nèi)容。
這樣就是一種浪費了,我們完全可以把jquery多帶帶提取出來,在兩個頁面里分別引入。如果是多個頁面都引入同一個庫,那提取公共庫就會是剛需。
修改webpack.config.js的module.exports
module.exports={ entry:{ a:"./src/js/a.js", b:"./src/js/b.js" }, output:{ path:path.resolve(__dirname,"dist"), filename:"js/[name].js" //以key做為輸出的名字 }, plugins:[ new HtmlWebpackPlugin({ title:"a頁面", template:"./src/template.html", filename:"a.html", chunks:["a","vender"], //vender為提取出的公共部分,需要在頁面里引入 }), new HtmlWebpackPlugin({ title:"b頁面", template:"./src/template.html", filename:"b.html", chunks:["b","vender"], }), new MiniCssExtractPlugin({ filename:"css/index.css" }), ], devServer:{ //... }, module:{ //... }, optimization:{ splitChunks:{ cacheGroups:{ common:{ name:"vender", test: /.js/, chunks:"initial" } } } } }
npm run build后結(jié)構(gòu)目錄如下圖,再次看一下a.js與b.js的大小,相比前面是否小了很多?公共的jquery已經(jīng)被提取出來了并放到了vender.js中。查看a.html與b.html頁面源碼發(fā)現(xiàn)vender.js已經(jīng)被引入了。
至此Webpack 4.X的內(nèi)容已經(jīng)全部寫完~
源碼下載:https://pan.baidu.com/s/1h9PS...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97108.html
摘要:處理與的語法大部分已經(jīng)被各在瀏覽器所支持,當然除了萬惡的,但是部分新增很遺憾并不被瀏覽器所支持比如內(nèi)置對象新增的一些方法和對象等。但是在這里卻不需要,是因為的里已經(jīng)把內(nèi)容添上了,就不需要創(chuàng)建文件了源碼下載下一篇從入門到精通第三方庫六 通過上一篇文章相信大家已經(jīng)明白了loader的概念。那這篇文章繼續(xù)介紹一些常用loader,并展現(xiàn)它的強大之處 處理less less與sass的功能都一...
摘要:同時它還提供了自動刷新熱更新等功能,使開發(fā)變得非常方便。的到來減少了很多的配置,它內(nèi)置了很多的功能。 上一篇文章里詳細介紹了一下插件的用法,這一篇文章接著豐富module.exports里的屬性。如今的前端發(fā)展已經(jīng)非常迅速了,伴隨而來的是開發(fā)模式的轉(zhuǎn)變?,F(xiàn)在已經(jīng)不再是寫個靜態(tài)頁面并放在瀏覽器里打開預(yù)覽一下了。在實際的開發(fā)中會經(jīng)常需要使用http服務(wù)器,比如之前的ajax,想要看到效果就...
摘要:這就需要把文件單獨拎出來,那需要一個插件來配合才能完成版本需要以上,低版本請使用使用步驟安裝在里引入模塊寫入陳學輝文件目錄會放入里寫入代替執(zhí)行命令后可以看到目錄里已經(jīng)多了一個文件夾,這個文件夾里放了一個文件。 概念 在webpack中任何一個東西都稱為模塊,js就不用說了。一個css文件,一張圖片、一個less文件都是一個模塊,都能用導(dǎo)入模塊的語法(commonjs的require,E...
摘要:針對的初學者,從無到有的語言如何入門,主要包括了的簡介,如何下載,如何安裝,如何使用終端,等各種開發(fā)環(huán)境進行開發(fā),中的語法和基本知識概念和邏輯,以及繼續(xù)深入學習的方法。 ...
文章目錄 強烈推薦系列教程,建議學起來??! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
閱讀 2113·2021-09-06 15:02
閱讀 1740·2021-08-13 15:02
閱讀 2301·2019-08-29 14:14
閱讀 1464·2019-08-26 13:55
閱讀 547·2019-08-26 13:46
閱讀 3401·2019-08-26 11:41
閱讀 508·2019-08-26 10:27
閱讀 3257·2019-08-23 15:28