github源碼地址 https://github.com/ghshuo/webpack demo webpack介紹 webpack 是一個現代 JavaScript 應用程式的靜態模塊打包器(module bundler)。當 webpack 處理應用程式時,它會遞歸地構建一個依賴關係圖(dep ...
github源碼地址 https://github.com/ghshuo/webpack-demo
webpack介紹
webpack 是一個現代 JavaScript 應用程式的靜態模塊打包器(module bundler)。當 webpack 處理應用程式時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程式需要的每個模塊,然後將所有這些模塊打包成一個或多個 bundle。
學習文檔 :
- webpack官網: http://webpack.github.io/
- webpack文檔(英文): https://webpack.js.org/
- webpack文檔(中文): https://doc.webpack-china.org/
安裝
1.全局安裝webpack
npm install webpack -g
npm install [email protected] -g 可以規定webpack的安裝版本
2.初始化
3.項目中局部安裝
npm install webpack --save-dev
webpack.config.js配置
1.entry選項(入口配置)
entry:{
entry: './src/entry.js',
}
2.entry選項(出口配置)
output:{
path: path.resolve(__dirname,'dist'), // 出口地址 絕對路徑
filename:'[name].js' // //輸出的文件名稱
}
3.module模塊
解讀css
安裝
npm install style-loader --save-dev
npm install --save-dev css-loader
module模塊中配置
module:{
rules: [
{
test: /\.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
},
配置圖片
* npm install --save-dev file-loader url-loader
* file-loader 解決引用路徑的問題
* url-loader 如果圖片較多,會發很多http請求,會降低頁面性能。
{ // 配置圖片
test: /\.(png|jpg|gif)/,
use:[{
loader:'url-loader', // url-loader
options:{
limit:400000, // 是把小於400000B的文件打成Base64的格式
outputPath:'images/' // 把圖片打包到指定路徑下
}
}]
}
直接在文件中引用img圖片
npm install html-withimg-loader --save
{
test: /\.(htm|html)$/i,
use:[ 'html-withimg-loader']
}
4.plugins插件
壓縮代碼
* 引入: 不需要安裝 const uglifyJsPlugin = require('uglifyjs-webpack-plugin');
配置
plugins:[
new uglifyJsPlugin()
]
html 打包
* npm install --save-dev html-webpack-plugin
const htmlPlugin = require('html-webpack-plugin');
plugins:[
new htmlPlugin({
minify:{
removeAttributeQuotes:true // minify:是對html文件進行壓縮,removeAttrubuteQuotes是卻掉屬性的雙引號。
},
hash:true, // 為了開發中js有緩存效果,所以加入hash,這樣可以有效避免緩存JS。
template:'./src/index.html' //是要打包的html模版路徑和文件名稱
})
]
5.熱更新功能
npm install webpack-dev-server --save-dev
再設置
devServer:{
//設置基本目錄結構
contentBase:path.resolve(__dirname,'dist'),
//伺服器的IP地址,可以使用IP也可以使用localhost
host:'localhost',
//服務端壓縮是否開啟
compress:true,
//配置服務埠號, 可以自己設置埠號
port: 1818
}
一般直接啟動 npm run server 查看就能進行熱更新
如果不能進行熱更新添加 HotModuleReplacementPlugin插件
plugins 中配置
new webpack.HotModuleReplacementPlugin()
6.CSS分離與圖片路徑處理
把CSS單獨提取出來,分離css
npm n install --save-dev extract-text-webpack-plugin
const extractTextPlugin = require("extract-text-webpack-plugin");
plugins[
new extractTextPlugin("/css/index.css")
]
再配置下模塊
module:{
rules:[
{
test: /\.css$/,
use: extractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
}
分離出來之後css路徑不正確 需要下麵修改下
var filePath = {
publicPath: "http://localhost:1818/" // 聲明一個路徑 處理靜態文件路徑
}
//出口文件的配置項
output:{
publicPath:website.publicPath
}
安裝css預編譯語言
1.less
npm install --save-dev less
npm install --save-dev less-loader
webpack.config.js
配置less
{
test: /\.less$/,
use: [{
loader: "style-loader"
}, {
loader: "css-loader"
, {
loader: "less-loader"
}]
}
less 分離
npm n install --save-dev extract-text-webpack-plugin
const extractTextPlugin = require("extract-text-webpack-plugin");
plugins[
new extractTextPlugin("/css/index.css")
]
use:extractTextPlugin.extract({
use:[{
loader:'css-loader'
},{
loader:'less-loader'
}],
fallback:'style-loader'
})
2.sass
npm install --save-dev node-sass
npm install --save-dev sass-loader
{
test: /\.scss$/,
use: extractTextPlugin.extract({
use: [{
loader: "css-loader"
}, {
loader: "sass-loader"
}],
fallback: "style-loader"
})
}
自動處理css3屬性前戳
需要安裝兩個包postcss-loader 和autoprefixer(自動添加首碼的插件)
npm n install --save-dev postcss-loader autoprefixer
在webpack.config.js同級目錄下新建一個postcss.config.js文件
module.exports = {
plugins: [
require('autoprefixer')
]
}
loader配置
{
test: /\.css$/,
use: extractTextPlugin.extract({
fallback: 'style-loader',
use: [
{ loader: 'css-loader', options: { importLoaders: 1 } },
'postcss-loader'
]
})
}
消除未使用的CSS
安裝PurifyCSS-webpack
npm i -D purifycss-webpack purify-css
引入glob
因為我們需要同步檢查html模板,所以我們需要引入node的glob對象使用。在webpack.config.js文件頭部引入glob。
constc glob = require('glob');
引入purifycss-webapck
constc PurifyCSSPlugin = require("purifycss-webpack");
配置plugins
new PurifyCSSPlugin({
paths: glob.sync(path.join(__dirname, 'src/*.html')),
})
babel
把es6 轉化成es5 語法
npm i -D babel-loader babel-core babel-preset-env babel-polyfill
module中配置
{
test:/\.(jsx|js)$/,
use:{
loader:'babel-loader',
},
exclude:/node_modules/
}
配置babel預設文件
在根目錄下創建一個.babelrc文件
{
"presets": ["env"]
}
打包調試
source-map:在一個單獨文件中產生一個完整且功能完全的文件。這個文件具有最好的source map,但是它會減慢打包速度;
cheap-module-source-map:在一個單獨的文件中產生一個不帶列映射的map,不帶列映射提高了打包速度,但是也使得瀏覽器開發者工具只能對應到具體的行,不能對應到具體的列(符號),會對調試造成不便。
eval-source-map:使用eval打包源文件模塊,在同一個文件中生產乾凈的完整版的sourcemap,但是對打包後輸出的JS文件的執行具有性能和安全的隱患。在開發階段這是一個非常好的選項,在生產階段則一定要不開啟這個選項。
cheap-module-eval-source-map:這是在打包文件時最快的生產source map的方法,生產的 Source map 會和打包後的JavaScript文件同行顯示,沒有影射列,和eval-source-map選項具有相似的缺點。
module.exports = {
devtool: 'eval-source-map',
}
}
配置生產和開發並行
修改package.json命令
其實就是添加一個dev設置,並通過環境變數來進行區分,下麵是package.json里的值。
"scripts": {
"server": "webpack-dev-server --open",
"dev":"set type=dev&webapck",
"build": "set type=build&webpack"
}
修改webpack.config.js文件
if(process.env.type == "build"){
var filePath = {
publicPath: "線上地址/"
}
}else{
var filePath = {
publicPath: "本地地址/"
}
}
列印傳遞過來的值
console.log( encodeURIComponent(process.env.type) );
引用第三方庫
安裝
npm install --save jquery
用plugin 引入 ProvidePlugin插件
constc webpack = require('webpack');
webpack.config.js中plugins配置
plugins:[
new webpack.ProvidePlugin({
$:"jquery"
})
]
watch 用法
隨著項目大了,項目進行聯調時,我們不需要每一次都去打包,使用watch解決了這個麻煩,只要代碼進行保存之後會自動進行打包。 watch是webpack中自帶插件
watchOptions:{
//檢測修改的時間,以毫秒為單位
poll:1000,
//防止重覆保存而發生重覆編譯錯誤。這裡設置的500是半秒內重覆保存,不進行打包操作
aggregateTimeout:500,
//不監聽的目錄
ignored:/node_modules/,
}
但是運行這個插件 必須要引入webpack
const webpack = require('webpack');
運行webpack --watch 進行打包
添加註釋版權所有
BannerPlugin插件
js上添加z註釋是誰寫的 ,創建時間,都可以進行設置
new webpack.BannerPlugin('hsgeng版權所有')
多個第三方類庫抽離
npm instawll vue --save
npm install --save jquery
入口文件配置
entry:{
entry:'./src/entry.js',
jquery:'jquery',
vue:'vue'
}
new webpack.optimize.CommonsChunkPlugin({
//name對應入口文件中的名字,我們起的是jQuery
name:['jquery','vue'],
//把文件打包到哪裡,是一個路徑
filename:"assets/js/[name].js",
//最小打包的文件模塊數,這裡直接寫2就好
minChunks:2
})
靜態資源輸出
項目中有些沒有引用的靜態資源(圖片、開發文檔),想在打包的時候保留這些靜態資源,可以直接打包到指定的文件夾下麵
安裝
npm install --save-dev copy-webpack-plugin
引入
const copyWebpackPlugin= require("copy-webpack-plugin");
plugins 進行配置
new copyWebpackPlugin([{
from:__dirname+'/src/public', // 要打包的靜態資源目錄地址
to:'./public' // 要打包到的文件夾路徑,跟隨output配置中的目錄
}])
json配置文件使用
入口文件中引用json
var json =require('../config.json');
document.getElementById("json").innerHTML= json.name;
打包命令
webpack
運行
npm run server
總結
學習webpack過程中進行了總結。如果有什麼不對地方,請大家指正一下,謝謝!