webpack 學習總結demo

github源碼地址 https://github.com/ghshuo/webpack-democss

webpack介紹

webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序須要的每一個模塊,而後將全部這些模塊打包成一個或多個 bundle。html

學習文檔 :

  • webpack官網: http://webpack.github.io/
  • webpack文檔(英文): https://webpack.js.org/
  • webpack文檔(中文): https://doc.webpack-china.org/

安裝

1.全局安裝webpack

npm install webpack -g
npm install webpack@3.xx -g 能夠規定webpack的安裝版本

2.初始化

webpack初始化

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

安裝vue

npm install style-loader --save-dev
npm install --save-dev css-loader

module模塊中配置node

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

再設置jquery

devServer:{
//設置基本目錄結構
contentBase:path.resolve(__dirname,'dist'),
//服務器的IP地址,可使用IP也可使用localhost
host:'localhost',
//服務端壓縮是否開啓
compress:true,
//配置服務端口號, 能夠本身設置端口號
port: 1818
}

通常直接啓動 npm run server 查看就能進行熱更新webpack

若是不能進行熱更新添加 HotModuleReplacementPlugin插件css3

plugins 中配置git

new webpack.HotModuleReplacementPlugin()

6.CSS分離與圖片路徑處理

把CSS單獨提取出來,分離csses6

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
配置lessgithub

{
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過程當中進行了總結。若是有什麼不對地方,請你們指正一下,謝謝!

相關文章
相關標籤/搜索