# webpack 專案打包技術 ## 初始化 ### 1. 先建立一個npm專案 ``` mkdir webpack cd webpack npm init //建立npm專案 npm install -D webpack webpack-cli //加入兩個套件 ``` ### 2. 新增webpack.config.js的設定檔 ``` module.exports = { ...設定參數... } ``` ## 設定 ### mode: ``` mode: 'production' //生產模式 mode: 'development' //開發模式 ``` ### entry : webpack打包的進入點,因為webpack默認只會打包js的部分,如果要打包其他的檔案,需要加入loader設定 ``` entry: { index: './src/index.js', } ``` ### output: 打包後檔案放置的位置 ``` output: { path: path.resolve(__dirname, '../dist/'), filename: 'js/[name].js' } ``` ### optimize: 優化bundle,如果多個bundle打包都有相同的js,把它獨立出來,產生的地方,必須要在output那邊多加上chunkfilename ``` output: { ... chunkFilename: "chunk/[name].chunk.js" }, optimization: { splitChunks: { cacheGroups: { global: { name: "global", test: /[\\/]global[\\/]/, chunks: "all", minChunks: 5, minSize: 30000, }, commons: { name: "commons", test: /[\\/]node_modules[\\/]/, chunks: "all", minChunks: 5, minSize: 30000, }, } } }, ``` ### module: 設定各種loader ``` module: { rules: [ ...loader... ] } ``` > loader寫法範例 ``` { test:/\.css$/, Regular的形式 //配置方法 use :{ loader:"style-loader" } //物件寫法 use :[ "style-loader" ] //陣列寫法 use :[ "style-loader","css-loader" ] //兩個loader,是由右至左依序的loader開始執行 use :[ //設定參數 { loader:"url-loader", options:{ limit : '1024' } } ] use :['url-loader?limit=1024&name=[path][name].[ext]'] //參數簡寫 } ``` style-loader 與 css-loader 打包 .css ``` { test: /\.css$/, use: [ "style-loader", "css-loader?minimize" ] } ``` url-loader打包照片,小於1024會直接轉成DataURl放入文件中,大於1024的會套用file-loader處理 ``` { test: /\.(png|svg|jpg|jpeg|gif|ico)$/, use: ['url-loader?limit=1024&name=[path][name].[ext]&outputPath=images/',] } ``` ### externals: 部會把這些package打包到bundle裡 ``` externals: { jquery: 'jQuery' } ``` ### resolve: 名稱簡化用 ``` resolve: { alias: { 'vue$': 'vue/dist/vue.esm.js', } } import vue from 'vue/dist/vue.esm.js' //差別 import vue form 'vue' ``` ### plugins插件: 用法 ``` plugins: [ new 插件() ] ``` webpack.ProvidePlugin可以匯入npm module js插件(全局使用),就不需要再import或是require ``` plugins: [ new webpack.ProvidePlugin({ 'swal': 'sweetalert2', }) ] ``` 如果要匯入第三方js(全局使用),用別名取代後再匯入 ``` resolve: { alias: { 'Site': path.resolve(__dirname, '../main/assets/js/Site.js'), } }, plugins: [ new webpack.ProvidePlugin({ 'Site': 'Site', }) ] ``` ## 其他 如果使用 imagemin 在webpack 時發生錯誤,應該是系統缺少套件 ``` brew install libpng //mac上安裝 sudo apt-get install libpng16-dev //ubuntu 16.04上安裝 ```