webpack簡介:
- webpack 是一個前端資源加載/打包工具。 他將根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成對應的靜態資源
為什么使用webpack:
- 轉換Es6語法
- 轉換JSX
- css預處理器/前綴補全
- 圖片壓縮
- 壓縮混淆——不讓源代碼邏輯直接暴露
一. webpack安裝:
- 安裝 node.js —— 要使用webpack,必須確保電腦上存在著node.js這個運行環境
- 安裝webpack —— 在命令行輸入命令 npm install webpack -g
- npm 是 node.js 管理插件用的工具,install表安裝, -g表全局安裝
- 在命令行輸入 webpack -v 查看其是否安裝成功,并查看其版本
二. 配置文件出入口
- 首先創建一個文件 : webwebpack.config.js —— 這個文件就當作我們的配置文件
entry:
1. 單個entry(寫法1): module.exports = { entry: './input.js' 當前入口文件叫做 input.js } 2. 單個entry(寫法2): module.exports = { entry: { main: '.input.js' } }; 3.多個entry module.exports = { entry : { hame : './home.js', about:'./about.js' other:'./other.js' } } 復制代碼
output —— 出口就是webpack打包完成的輸出:
1.單個entry情況下對應的output: module.exports = { entry: './src/index.js', output: { path : path.resolve(_dirname,'dist'), //輸出后存儲的路徑 filename : 'output.bundle.js' // 輸出后文件的名字 } }; 2.多個entry情況下對應的output: module.exports = { entry : { hame : './home.js', about:'./about.js' other:'./other.js' }, output: { path : path.resolve(_dirname,'dist'), filename : '[name].bundle.js' // name會自動替換文件名為入口的屬性名 } } 復制代碼
三. loader-常用loader:
- Webpack自身只支持加載js和json模塊,而Loader能讓webpack去處理其他類型的文件
- loader需要下載,如果不知道要下什么,可根據報錯下載所需loader
url-loader - 將文件轉換為base64 url的webpack加載程序,通常用于處理圖片:
module.exports = { module: { rules : [{ test : /.(png|jpg|gif)$/i, //要匹配的文件 use : [{ loader : 'url-loader', //使用的規則 options : { limit:8192 //文件大小限制 } }] }] } }; 復制代碼
babel-loader - 把高版本的js向后(es5)兼容
module :{ rules:[ //這個是url-loader { test:/.(png|jpg|gif)$/i, use:[ { loader:'url-loader', options:{ limit:8192 } } ] }, //這個是babel-loader { test:/.m?js$/, //檢測將要匹配的文件 exclude: /(node_modules|bower_components)/, //要排除的文件 use:{ //使用了什么loader loader : 'babel-loader', options:{ presets:['@babel/preset-env'] //使用什么規則 } } } ] } 復制代碼
sass-loader:
module.exports = { module: { rules : [ // sass { test: /.s[ac]ss$/i, use: [ 'style-loader', 'css-loader', 'sass-loader', ], }, ] } }; 復制代碼
四. Plugin-常用插件:
- Plugin和loader是兩個比較混淆和模糊的概念。Loader是用來轉換和加載特定類型的文件,所以loader的執行層面是單個的源文件。而plugin可以實現的功能更強大,plugin可以監聽webpack處理過程中的關鍵事件,深度集成進webpack的編譯器,可以說plugin的執行層面是整個構建過程。Plugin系統是構成webpack的主干,webpack自身也基于plugin系統搭建,webpack有豐富的內置插件和外部插件,并且允許用戶自定義插件
- 與loader不同的是,使用plugin我們必須先引用該插件
例如:
const webpack = require('webpack'); // 用于引用webpack內置插件 const htmlWebpackPlugin = require('html-webpack-plugin'); // 外部插件 module.exports = { plugins: [ new webpack.HotModuleReplacementPlugin(), new HtmlWebpackPlugin({template: './input.html'}) ] }; 復制代碼
minCssExtract:
plugins:[ new MiniCssExtracPlugin({ filename:'[name].css', //name 為 entry里的名字 不是必須設置 chunkFilename: '[id].css' //不是必須設置 }) ] //要使用這個的時候,要在sass-loader中的use里在配置一下,將style-loader換成這個MiniCssExtracPlugin.loader 復制代碼
DefinePlugin:
- definePlugin允許創建可以配置的全局常量 new webpack.DefinePlugin([ 'service_url' : josn.stringify('http://www.baidu.com') // service_url 為變量,這樣即使改變訪問的地址,也可以通過變量來控制 ]) 復制代碼
HtmlWebpackPlugin-幫助我們生成html文件
1. 系統默認生成的: plugins: [ new HtmlWebpackPlugin() // 這樣就能執行了-> 就會生成index.html文件,并且會自動幫我們引入js和css文件 ] 2. 我們自定義的 new HtmlWebpackPlugin({ title: 'My App', //html的title filename: 'indexa.html' //生成的文件名字 template: 'template.html' //自己的輸入文件的內容——在創建一個template.html文件 //就可以在template.html文件里定義title —— 在title標簽里輸入<%= htmlWebpackPlugin.options.title %> //同樣也可在此文件里引用script 或 其他不需要打包的div }) //之后我們indexa.html里,就會出現template.html文件里定義的東西 復制代碼
五. DevServer-熱更新:
module.exports = { //... devServer: { contentBase: path.join(__dirname, 'dist'), //在哪個目錄下啟動該插件 ,并且此dist要與上面的output 相一致 compress: true, //是否壓縮 port: 9000 // 啟動的端口 // hot: true // 熱替換 不寫也是熱替換 現在寫true有可能報錯,所以還是別寫了吧 } }; 復制代碼
注:
- 通常我們都會初始化文件 獲得查看配置文件的文件。
- npm init - y
作者:Honer
鏈接:https://juejin.im/post/5da898376fb9a04dea5df587
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。