webpack前端應(yīng)用之基礎(chǔ)打包實現(xiàn)
前言:初識 Webpack 5
webpack 是一個靜態(tài)資源的打包工具,會以一個或多個文件為入口,將這一個或多個文件直接或間接使用到的所有文件,組合成一個或多個文件輸出。輸出的文件就是編譯好的文件,通常稱其為 bundle,可以在瀏覽器上運行。Webpack 本身能力有限,在不添加 loader、plugin等擴展時能力有限。
Webpack 能讓前端具有 模塊化 和 工程化。
一、前端工程化
1、webpack
(1)定義:是一個前端的構(gòu)建工具。前端代碼格式多(html、css、js、圖片),前端構(gòu)建工具的作用是將各種格式不同文件打包到一起,方便項目的上線運行。(將開發(fā)環(huán)境的代碼轉(zhuǎn)換成運行環(huán)境的代碼)
開發(fā)環(huán)境的代碼:便于閱讀
運行環(huán)境的代碼:能夠更快的執(zhí)行(通常會對代碼進行壓縮)
? (2)主要功能:
? A、代碼壓縮:將js代碼、css代碼、靜態(tài)的資源文件(圖標、圖像)等進行混合壓縮,使代碼的體積變小、加載速度更快
B、統(tǒng)一編譯語法:css、less、sass,ES6語法、TypeScript語法等,語法要求不同在不同瀏覽器上運行時會出現(xiàn)問題,就需 要使用構(gòu)建工具進行統(tǒng)一編譯
C、模塊化處理:css、js都有自己的模塊化處理方式,對于這些模塊化的語法在不同瀏覽器上的兼容性很差,需要使用構(gòu)建工具統(tǒng)一模塊化的形式,提高兼容性
2、webpack的使用:配置文件所需要的信息(五大配置屬性)
(1)entry(入口配置):配置打包的入口文件(即從項目的哪個文件開始打包)
(2)output(輸出配置):配置打包后的文件,名稱是什么、存儲路徑是什么
path:指明存儲路徑
filename:指定打包后的文件名
clean:指定打包前是否清空打包的輸出目錄
(3)Loaders(加載器):webpack只能處理js、json等文件,若需要打包處理其他格式的文件(css、less、sass、vue、圖片)時需要使用不同的loader(插件)輔助完成。若安裝了不同的loader,需要在webpack的配置中通過module.rules進行配置
(4)plugins (插件):擴展webpack的功能。如html插件
(5)mode(打包的模式): webpack 有兩種打包模式:生產(chǎn)模式 production 和 開發(fā)模式 development。兩種模式都只能編譯ES6中的模塊(Module)語法。
3、示例
(1)創(chuàng)建文件夾(根目錄): webpack-study
(2)進入該文件夾,打開cmd窗口(vs code終端)
?(3)將該文件夾初始化為npm項目:npm init
(4)安裝 webpack 開發(fā)依賴:npm install webpack webpack-cli -D
或 npm install webpack -D
npm install webpack-cli -D
強調(diào):
? A、使用npm安裝包時,若沒有指定版本號,默認安裝最新版本
B、package.json文件中dependencies鍵的含義是發(fā)布后還依賴的,devDependencies鍵的
含義是開發(fā)時的依賴
? C、npm install —save:將依賴包安裝到dependencies鍵下;npm install —save-dev將依賴
包安裝到devDependencies鍵下
D、i 是 install 的縮寫,-D 是 —save-dev 的縮寫(即在開發(fā)時的依賴)
? (5)項目的目錄結(jié)構(gòu):

(6)寫代碼
? (7)在項目的根目錄下創(chuàng)建webpack的配置文件:webpack.config.js
/**
* webpack的基本打包配置有: entry、output、mode 三項即可
*/
const path = require('path');
module.exports = {
entry:'./src/main.js',//配置打包入口文件
output:{//輸出配置
path: path.join(__dirname,'dist'),//配置輸出文件的保存位置
filename:'js/bundle.js',//打包后的文件名
clean: true,//打包前是否將打包的輸出目錄清空
},
mode:'development'//以開發(fā)模式打包
}(8)在package.json文件中配置打包指令
"scripts": {
"build": "webpack"
}? (9)運行打包指令進行打包
? (10)將打包后的js文件導入頁面文件(index.html)中
4、webpack中使用的loader
? (1)url-loader:用來打包圖像文件
? (2)’style-loader’, ‘css-loader’, ‘less-loader’:用來打包樣式文件
? (3)babel-loader:打包js文件
? (4)vue-loader:打包.vue文件
此處附加 webpack官網(wǎng)
二、webpack配置詳解
const { resolve } = require('path'); // node 內(nèi)置核心模塊,用來處理路徑問題。
module.exports = {
mode: 'development' //開發(fā)環(huán)境 production //生產(chǎn)環(huán)境
entry: './src/js/index.js', // 單入口文件
// entry: { //多入口 會打包雙方重復文件
// index: './src/index.js',
// another: './src/another-module.js'
// },
// entry: { //多入口 lodash不會重復打包
// index: { import: './src/index.js', dependOn: 'shared' },
// another: { import: './src/another-module.js', dependOn: 'shared' },
// shared: 'lodash' //不會重復打包
// },
output: { // 輸出配置
//filename: './built.js', // 輸出文件名
path: resolve(__dirname, 'dist'), //打包后的輸出位置 webpack當前目錄下的 dist
//contenthash根據(jù)內(nèi)容變化生成文件名 不變不修改名字會用緩存
filename: 'scripts/[name].[contenthash].js', //'bundle.js', //打包后的文件名 多個入口不能寫固定一個名字
clean: true, //打包后清除上次內(nèi)容
assetModuleFilename: 'images/[contenthash][ext]', //靜態(tài)文件打包地址/文件名
publicPath: ''
},
// devtool: 'inline-source-map', //打包后找到真實源代碼位置
devServer: { //實時更新
static: './dist',
hot: true, //開啟熱更新
compress: true, // 啟動gzip壓縮
port: 3000, // 端口號
open: true // 自動打開瀏覽器
proxy: { //代理
'/api': {
target: 'http://localhost:4000',
changeOrigin: true,
ws: true,
pathRewrite: {
'^/api': ''
}
}
}
},
module: {
rules: [
// 詳細loader配置
// 不同文件必須配置不同loader處理
{
test: /\.(jpg|gif|png)/,
use: 'url-loader',
option: {// 圖片大小小于8kb,就會被base64處理// 優(yōu)點: 減少請求數(shù)量(減輕服務(wù)器壓力)// 缺點:圖片體積會更大(文件請求速度更慢)
esModule: true,
limint: 5 * 1024, //圖片是否轉(zhuǎn)base64
name: '[hash: 10].[ext]' //圖片命名
}
},
{
test: /\.(css|less)$/,
// use: ['style-loader', 'css-loader', 'less-loader'] //從后往前編譯 先解析在編譯 行內(nèi)樣式
use: ['MinCssExtractPlugin.loader', 'css-loader', 'less-loader'], //把css文件打包到一個css 用link引入到html中
},
{
test: /\.js$/,
exclude: /node_modules/, // 不打包指定路徑下的js文件
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: [
[
'@babel/plugin-transform-runtime' //為promise解決
]
]
}
}
},
]
},
plugins: [
webpack.HotModuleReplacementPlugin(), //熱更新
new HtmlWebpackPlugin({
template: './index.html', //要打包的html
filename: 'app.html', //html打包后的名字
inject: 'body', //script 標簽生成地址
collapseWhitespace: true, //壓縮移除空格
removeComments: true, //壓縮移除注釋
}),
new MinCssExtractPlugin({ //把css文件打包到一個新css 用link引入到html中 可修改地址/文件名
filename: 'styles/[contenthash].css'
})
],
optimization: {
minimizer: [
new CssMinimizerWebpackPlugin() //還需將mode改為production 會壓縮css代碼
],
splitChunks: {
// chunks: 'all',// 公共文件 lodash不會重復打包
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chuns: 'all'
}
}
}
}
};到此這篇關(guān)于webpack前端應(yīng)用之基礎(chǔ)打包實現(xiàn)的文章就介紹到這了,更多相關(guān)webpack 基礎(chǔ)打包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
支付寶小程序?qū)崿F(xiàn)類似微信多行輸入功能(思路詳解)
這篇文章主要介紹了支付寶小程序?qū)崿F(xiàn)類似微信多行輸入功能,輸入超過 8 行的時候會出現(xiàn)滾動,這樣做的好處就是輸入框不會直接頂?shù)巾撁孀铐敳?支付寶小程序?qū)崿F(xiàn)多行輸入框:使用textarea多行輸入框?qū)崿F(xiàn),感興趣的朋友一起看看吧2024-02-02
JS結(jié)合bootstrap實現(xiàn)基本的增刪改查功能
這篇文章主要介紹了JS結(jié)合bootstrap實現(xiàn)基本的增刪改查功能,需要的朋友可以參考下2016-07-07
layui(1.0.9)文件上傳upload,前后端的實例代碼
今天小編就為大家分享一篇layui(1.0.9)文件上傳upload,前后端的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
淺聊一下Javascript中的數(shù)據(jù)類型和類型轉(zhuǎn)換
在JavaScript中,理解數(shù)據(jù)類型,如何區(qū)分它們,以及它們?nèi)绾伪晦D(zhuǎn)換是至關(guān)重要的,在這篇文章中,我們將探討這些主題,以幫助大家鞏固JavaScript基礎(chǔ)2023-08-08
uniapp自定義多列瀑布流組件項目實戰(zhàn)總結(jié)
這篇文章主要為大家介紹了uniapp自定義多列瀑布流組件實戰(zhàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
JavaScript中eval和with語句如何影響作用域鏈的深度探索
這篇文章主要為大家介紹了JavaScript中eval和with語句如何影響作用域鏈的深度探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05

