github源碼地址 https://github.com/ghshuo/webpack-democss
webpack 是一個現代 JavaScript 應用程序的靜態模塊打包器(module bundler)。當 webpack 處理應用程序時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程序須要的每一個模塊,而後將全部這些模塊打包成一個或多個 bundle。html
npm install webpack -g npm install webpack@3.xx -g 能夠規定webpack的安裝版本
npm install webpack --save-dev
entry:{ entry: './src/entry.js', }
output:{ path: path.resolve(__dirname,'dist'), // 出口地址 絕對路徑 filename:'[name].js' // //輸出的文件名稱 }
安裝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/' // 把圖片打包到指定路徑下 } }] }
npm install html-withimg-loader --save
{ test: /\.(htm|html)$/i, use:[ 'html-withimg-loader'] }
* 引入: 不須要安裝 const uglifyJsPlugin = require('uglifyjs-webpack-plugin');
配置 plugins:[ new uglifyJsPlugin() ]
* 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模版路徑和文件名稱 }) ]
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()
把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 }
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' })
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" }) }
須要安裝兩個包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' ] }) }
安裝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')), })
把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是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
var json =require('../config.json'); document.getElementById("json").innerHTML= json.name;
webpack
npm run server
學習webpack過程當中進行了總結。若是有什麼不對地方,請你們指正一下,謝謝!