詳解webpack4.x之搭建前端開(kāi)發(fā)環(huán)境
webpack是一個(gè)現(xiàn)代JavaScript應(yīng)用程序的靜態(tài)模塊打包器,借用官網(wǎng)的一張圖,它能夠?qū)⒁恍╊A(yù)處理語(yǔ)言,js的最新語(yǔ)法轉(zhuǎn)換成瀏覽器識(shí)別的內(nèi)容。現(xiàn)在一般的前端框架都有比較成熟的腳手架,大多數(shù)對(duì)webpack都有個(gè)較好的集成,我們只需要敲一些簡(jiǎn)單的命令就能生成一個(gè)通用的項(xiàng)目模板,比較便捷,但是要知其然知其所以然,所以今天就嘗試著從零開(kāi)始搭建一個(gè)前端開(kāi)發(fā)環(huán)境。
項(xiàng)目源碼:
https://github.com/gerryli0214/webpack-demo
webpack的四個(gè)核心概念:
1.、入口(entry)
2、輸出(output)
3、loader
4、插件(plugins)
首先,我們執(zhí)行下npm init;初始化一個(gè)node工程,填寫(xiě)項(xiàng)目的信息,整個(gè)項(xiàng)目的目錄結(jié)構(gòu)如下:
全部安裝webpack-cli:
npm install webpack-cli -g
新建一個(gè) webpack.config.js, 這個(gè)是webpack默認(rèn)配置文件,在里面我們可以配置打包信息,初始化文件為:
const config = {}; module.exports = config;
入口(entry):
項(xiàng)目的入口文件,可以配置單個(gè)/多個(gè),為入口文件的相對(duì)路徑,type: string/object; 我們項(xiàng)目入口文件為index.js。
const config = { entry: './src/index.js' } module.exports = config;
輸出(output):
打包后的文件路徑和配置信息,path為打包文件路徑,filename為輸出文件名稱(chēng),name為原始文件名稱(chēng),hash為打包后的hash地址:
output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash].min.js' }
loader:
loader能夠處理非JavaScript文件,webpack默認(rèn)只能處理JavaScript文件。在使用loader時(shí),首先要安裝下指定loader的依賴(lài),此部分的配置規(guī)則與之前版本有所差異,具體配置如下:
npm install babel-loader css-loader -D
module: { rules: [{ test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, { test: /\.js/, exclude: /node_modules/, //過(guò)濾node_modules文件夾 use: [{ loader: 'babel-loader' }] } ] }
插件(plugins):
插件是webpack最為強(qiáng)大的功能之一,利用插件,我們可以進(jìn)行代碼的混淆、壓縮、重新定義項(xiàng)目環(huán)境變量等。插件分為webpack內(nèi)置插件和第三方插件,第三方插件在使用時(shí)首先要安裝依賴(lài)和導(dǎo)入依賴(lài)模塊。詳細(xì)的使用方法可以參考npm。下面羅列了幾個(gè)項(xiàng)目中常用的插件:
html-webpack-plugin:
主要作用:
1、為html文件中引入的外部資源如 script
、 link
動(dòng)態(tài)添加每次compile后的hash,防止引用緩存的外部文件問(wèn)題
2、可以生成創(chuàng)建html入口文件,比如單頁(yè)面可以生成一個(gè)html文件入口,配置多個(gè)就可以打包成多頁(yè)面
extract-text-webpack-plugin:
主要作用:分離打包的css文件
uglifyjs-webpack-plugin:
主要作用:混淆js代碼
webpack-bundle-analyzer:
主要作用:生成打包文件報(bào)告,可以看到各個(gè)模塊打包后文件大小信息
clean-webpack-plugin:
主要作用:每次打包之前清除dist文件夾
配置信息如下:
const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const CleanWebpackPlugin = require('clean-webpack-plugin'); const config = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash].min.js' }, module: { rules: [{ test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, { test: /\.js/, exclude: /node_modules/, //過(guò)濾node_modules文件夾 use: [{ loader: 'babel-loader' }] } ] }, optimization: { splitChunks: { name: "vendor", filename: 'vendor-[hash].min.js' }, minimizer: [new UglifyJsPlugin()] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }), new ExtractTextPlugin({ filename: 'build.min.css', allChunks: true, }), new webpack.BannerPlugin({ banner: `構(gòu)建時(shí)間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}` }), new CleanWebpackPlugin(), // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }), new BundleAnalyzerPlugin() ] }; module.exports = config;
以上為打包的基礎(chǔ)配置信息,在我們實(shí)際開(kāi)發(fā)中,經(jīng)常會(huì)用到前端開(kāi)發(fā)服務(wù),模塊熱更新以及前端的跨域請(qǐng)求代理,webpack中提供了webpack-dev-server來(lái)滿足我們的需求,在使用之前先安裝下webpack-dev-server的依賴(lài):
npm install webpack-dev-server -D
具體文件配置如下:
devServer: { contentBase: path.join(__dirname, 'dist'), compress: true, host: '0.0.0.0', port: 9000, hot: true, //是否熱更新 proxy: { //代理 '/api': 'http://localhost:3000' } }
package.json中啟動(dòng)命令配置如下:
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "webpack-dev-server --mode development", "build": "webpack --mode production" }
執(zhí)行npm run start,執(zhí)行結(jié)果如下:
這樣開(kāi)發(fā)環(huán)境我們的主要配置就完成了,但是當(dāng)我們用uglifyjs壓縮es6代碼時(shí),會(huì)發(fā)現(xiàn)會(huì)報(bào)錯(cuò),因?yàn)閡glifyjs不能壓縮es6的代碼,此時(shí)我們需要手動(dòng)配置下babel,具體步驟如下:
1、安裝項(xiàng)目依賴(lài)
npm install @babel/core @babel/preset-env -D
2、新建在項(xiàng)目根目錄下 .babelrc 文件,填入以下配置信息
{ "presets":["@babel/preset-env"] }
執(zhí)行npm run build,壓縮項(xiàng)目代碼,結(jié)果如下:
全部代碼:
const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const CleanWebpackPlugin = require('clean-webpack-plugin'); const config = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: '[name].[hash].min.js' }, module: { rules: [{ test: /\.css$/, use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, { test: /\.js/, exclude: /node_modules/, //過(guò)濾node_modules文件夾 use: [{ loader: 'babel-loader' }] } ] }, optimization: { splitChunks: { name: "vendor", filename: 'vendor-[hash].min.js' }, minimizer: [new UglifyJsPlugin()] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }), new ExtractTextPlugin({ filename: 'build.min.css', allChunks: true, }), new webpack.BannerPlugin({ banner: `構(gòu)建時(shí)間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}` }), new CleanWebpackPlugin(), // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }), new BundleAnalyzerPlugin() ], devServer: { contentBase: path.join(__dirname, 'dist'), compress: true, host: '0.0.0.0', port: 9000, hot: true, //是否熱更新 proxy: { //代理 '/api': 'http://localhost:3000' } }, devtool: 'source-map' }; module.exports = config;
參考資料:
webpack中文網(wǎng): https://www.webpackjs.com
webpack內(nèi)置插件列表: https://www.webpackjs.com/plugins/
第三方插件可自行搜索npm: https://www.npmjs.com/
項(xiàng)目源碼:https://github.com/gerryli0214/webpack-demo
文筆比較粗糙,如有問(wèn)題,煩請(qǐng)指出,謝謝!以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Webpack 4.x搭建react開(kāi)發(fā)環(huán)境的方法步驟
- 從零開(kāi)始搭建webpack+react開(kāi)發(fā)環(huán)境的詳細(xì)步驟
- 使用webpack搭建react開(kāi)發(fā)環(huán)境的方法
- 詳解Webpack+Babel+React開(kāi)發(fā)環(huán)境的搭建的方法步驟
- 使用vue-cli+webpack搭建vue開(kāi)發(fā)環(huán)境的方法
- 詳解webpack與SPA實(shí)踐之開(kāi)發(fā)環(huán)境搭建
- 詳解webpack+angular2開(kāi)發(fā)環(huán)境搭建
- 詳解基于webpack和vue.js搭建開(kāi)發(fā)環(huán)境
相關(guān)文章
JavaScript利用虛擬列表實(shí)現(xiàn)高性能渲染數(shù)據(jù)詳解
在前文中我們提到可以使用時(shí)間分片的方式來(lái)對(duì)長(zhǎng)列表進(jìn)行渲染,但這種方式更適用于列表項(xiàng)的DOM結(jié)構(gòu)十分簡(jiǎn)單的情況,所以本文來(lái)講講如何使用虛擬列表的方式,來(lái)同時(shí)加載大量數(shù)據(jù)吧2023-05-05淺談Webpack自動(dòng)化構(gòu)建實(shí)踐指南
本篇文章主要介紹了Webpack自動(dòng)化構(gòu)建實(shí)踐指南,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12讓插入到 innerHTML 中的 script 跑起來(lái)的代碼
讓插入到 innerHTML 中的 script 跑起來(lái)的代碼...2007-11-11再談javascript常見(jiàn)錯(cuò)誤及解決方法
下面小編就為大家?guī)?lái)一篇再談javascript常見(jiàn)錯(cuò)誤及解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09JavaScript檢測(cè)瀏覽器是否支持CSS變量代碼實(shí)例
這篇文章主要介紹了JavaScript檢測(cè)瀏覽器是否支持CSS變量代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04