成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一網打盡──Webpack工程打包之一

網絡 通信技術
什么是前端資源構建工具?在瀏覽器中是不認識sass、less、ts等web資源和js高級語法,只有通過webpack這樣的構建工具來將它們一一編譯成瀏覽器能夠讀取的js文件。

[[427986]]

本文轉載自微信公眾號「前端萬有引力」,作者 一川 。轉載本文請聯系前端萬有引力公眾號。

1.webpack的基本概念

1.1 webpack是什么?

webpack是一個現代js應用程序的靜態模塊打包器(module bundler),一種前端資源構建工具。

  • 什么是前端資源構建工具?在瀏覽器中是不認識sass、less、ts等web資源和js高級語法,只有通過webpack這樣的構建工具來將它們一一編譯成瀏覽器能夠讀取的js文件。
  • 什么是靜態資源打包器?在webpack處理應用程序時,它會遞歸構建一個依賴關系圖,將應用程序需要的所有模塊打包成一個或多個bundle。

1.2 webpack可以用來做什么?

webpack作為前端工程師最常用的前端資源構建工具,能夠解決很多在開發中的遇到的痛點和難點。

  • 可以不依賴后端,解決調用后端接口時的跨域問題
  • 在代碼改動后自動刷新瀏覽器,有緩存時也無需清除緩存
  • 可以方便解決css和js新特性在各瀏覽器上的兼容性問題,提高自己的開發效率
  • 無需使用額外的打包平臺和編寫打包腳本,也無需單獨對js、css等進行打包壓縮

當然,webpack的強大不止這些,它有很多簡單方便的配置能夠提升你的開發效率。

2. webpack的核心配置

常用的核心配置如下:

  • 入口 entry
  • 輸出 output
  • 加載器 loader
  • 插件 plugin
  • 模式 mode
  • 其它配置等

當然,以上列舉的是常用的配置,其它的需求可以查找官方文檔進行閱讀:[https://webpack.docschina.org/concepts/]

2.1 入口 entry

入口(entry)毫無疑問指的是webpack以哪個或哪些文件作為打包的起點,以哪個模塊來構建內部依賴圖。webpack會根據依賴圖去分析各個模塊之間的依賴關系,從而進行打包。

  1. //單文件入口,string形式:打包形成一個chunk,輸出一個bundle文件,當然在實際開發中的靈活性不大 
  2. entry:"./src/index.js" 
  3.  
  4. //多文件入口,array形式:所有文件最終形成一個chunck,輸出一個bundle文件 
  5. entry:["./src/index.js","./src/main.js"
  6.  
  7. //多文件入口,object形式:多個入口文件就形成多個chunk,最終輸出多個bundle文件,而chunk的名稱就是對象的key值.雖然這種方式比較繁瑣,但是其擴展性比較強,配置可以重復使用,也可以配合其它配置組合使用。 
  8. entry:{ 
  9.   index:"./src/index.js"
  10.   main:"./src/main.js" 

當然在描述入口的對象的時候,還有許多其它配置屬性,具體可以查看文檔。

  • dependOn: 當前入口所依賴的入口。它們必須在該入口被加載前被加載。
  • filename: 指定要輸出的文件名稱。
  • import: 啟動時需加載的模塊。
  • library: 指定 library 選項,為當前 entry 構建一個 library。
  • runtime: 運行時 chunk 的名字。如果設置了,就會創建一個新的運行時 chunk。在 webpack 5.43.0 之后可將其設為 false 以避免一個新的運行時 chunk。
  • publicPath: 當該入口的輸出文件在瀏覽器中被引用時,為它們指定一個公共 URL 地址。請查看 output.publicPath。

2.2 輸出 output

輸出(output)顯而易見就是告訴webpack在哪里輸出打包后的資源bundles,以及如何命名這些輸出文件。當然主要文件默認為"./dist/main.js",其它文件則放在"./dist"文件夾中。

  1. // 打包出口  
  2. output:{ 
  3.     // 輸出文件夾路徑 
  4.     path:path.resolve(__dirname,"dist"), 
  5.     // 文件名 
  6.     // filename:"bundle.js" 
  7.     // 如果多個入口起點,應當使用占位符確保每個文件具有唯一名稱 
  8.     filename:"[name].js"
  9.     // 所有資源引入公共路徑前綴,用于生產環境需謹慎 
  10.     publicPath:"",//編譯時,不知道其輸出文件的地址,則將其置空,在運行時通過入口起點文件的__webpack_public_path__進行動態配置。 
  11.     chunkFilename: "[contenthash:10].chunk.js"
  12.     clean: true, //打包前清空輸出目錄,相當于clean-webpack-plugin插件的作用。 
  13.     /* 當用 Webpack 去構建一個可以被其他模塊導入使用的庫時需要用到library */ 
  14.     library: { 
  15.         name"[name]",//整個庫向外暴露的變量名 
  16.         type: "window"//庫暴露的方式 
  17.     } 

切記:即使可以存在多個 entry 起點,但只能指定一個 output 配置。

2.3 加載器 loader

正如你所知道的,webpack只能解析js和json文件,這是其天生自帶的能力。而loader的能力就是讓webpack可以去處理其它類型的文件,將其轉為webpack能夠解析的模塊文件js或json,以提供給應用程序使用,生成到依賴圖中。

  1. // 加載器 
  2. loader:{ 
  3.     // 匹配文件類型,服從正則表達式語法 
  4.     test:/\.css/, 
  5.     // 定義在轉換時,使用到哪些loader,自下而上、自右至左進行處理 
  6.     use:[ 
  7.       "style-loader",//創建style標簽,將js文件中的樣式資源提取出來,添加到index.html文件的head標簽中 
  8.       "css-loader",//將css文件轉變成commonjs格式加載到js文件中 
  9.       { 
  10.         loader:"postcss-loader",//css的兼容性處理,切記:需要預先在package.json文件中配置browserlist 
  11.         options:{ 
  12.           postcssOptions:{ 
  13.             ident:"postcss"
  14.             // postcss-preset-env插件:幫postcss找到package.json中的browserslist配置,根據配置加載指定的兼容性樣式 
  15.             plugins:[require("postcss-preser-env")()] 
  16.           } 
  17.         } 
  18.       } 
  19.     ] 
  20.   }, 
  21.   {  
  22.       test: /\.js$/,  
  23.       // 注意需要在package.json配置browserslist,否則babel-loader不生效  
  24.       // js兼容處理 babel  
  25.       loader: "babel-loader",  
  26.       // 規則只使用一個loader時推薦寫法  
  27.       options: {  
  28.           presets: [  
  29.           [  
  30.               "@babel/preset-env"
  31.               // 預設:指示babel做怎么樣的兼容處理  
  32.               {  
  33.                   useBuiltIns: "usage",  
  34.                   //按需加載  
  35.                   corejs: {  
  36.                       version: "3",  
  37.                   },  
  38.                   targets: "defaults",  
  39.               }  
  40.            ]  
  41.          ]  
  42.     }  

2.4 插件 plugin

插件plugin:插件其實就是輔助loader去執行范圍更廣的人物,從打包優化、文件壓縮、資源管理以及重新注入環境變量。

  1. // CleanWebpackPlugin幫助你在打包時自動清除dist文件,學習時使用比較方便 
  2. // const { CleanWebpackPlugin } = require("clean-webpack-plugin"); //從webpack5開始,webpack內置了該功能,只要在ouput中配置clear為true即可 
  3.  
  4. // HtmlWebpackPlugin幫助你創建html文件,并自動引入打包輸出的bundles文件。支持html壓縮。 
  5. const HtmlWebpackPlugin = require("html-webpack-plugin"); 
  6.  
  7. // 該插件將CSS提取到單獨的文件中。它會為每個chunk創造一個css文件。需配合loader一起使用 
  8. const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 
  9.  
  10. // 該插件將在Webpack構建過程中搜索CSS資源,并優化\最小化CSS 
  11. const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin"); 
  12.  
  13. // vue-loader V15版本以上,需要引入VueLoaderPlugin插件,它的作用是將你定義過的js、css等規則應用到vue文件中去。 
  14. const { VueLoaderPlugin } = require('vue-loader'
  15.  
  16. module.exports = { 
  17.     module: { 
  18.         rules: [ 
  19.             { 
  20.                 test: /\.vue$/, 
  21.                 loader: "vue-loader" 
  22.             }, 
  23.             { 
  24.                 test: /\.css$/, 
  25.                 use: [ 
  26.                     // MiniCssExtractPlugin.loader的作用就是把css-loader處理好的樣式資源(js文件內),單獨提取出來 成為css樣式文件 
  27.                     MiniCssExtractPlugin.loader,//生產環境下使用,開發環境還是推薦使用style-loader 
  28.                     "css-loader"
  29.                 ], 
  30.             }, 
  31.         ], 
  32.     }, 
  33.     plugins: [ 
  34.         new HtmlWebpackPlugin({ 
  35.             template:"index.html" 
  36.         }), 
  37.         new MiniCssExtractPlugin({ 
  38.             filename: "css/built.css"
  39.         }), 
  40.         new OptimizeCssAssetsWebpackPlugin(), 
  41.         new VueLoaderPlugin(), 
  42.     ] 

2.5 模式

模式mode用于告知webpack需要使用對應環境模式下的配置,可以是production、development或者none,當然默認是production。

使用mode模式有兩種方式,可以是在配置對象中設置mode選項。

  1. module.exports = { 
  2.     mode:"development" 

也可以是在package.json中的cli進行配置:

  1. webpack --mode=development 

官方文檔中是這樣寫的:

選項 描述
development 會將 DefinePlugin 中 process.env.NODE_ENV 的值設置為 development. 為模塊和 chunk 啟用有效的名。
production 會將 DefinePlugin 中 process.env.NODE_ENV 的值設置為 production。為模塊和 chunk 啟用確定性的混淆名稱,FlagDependencyUsagePlugin,FlagIncludedChunksPlugin,ModuleConcatenationPlugin,NoEmitOnErrorsPlugin 和 TerserPlugin 。
none 不使用任何默認優化選項

如果要根據 webpack.config.js 中的 mode 變量更改打包行為,則必須將配置導出為函數,而不是導出對象:

  1. ar config = { 
  2.   entry: './app.js'
  3.   //... 
  4. }; 
  5.  
  6. module.exports = (env, argv) => { 
  7.   if (argv.mode === 'development') { 
  8.     config.devtool = 'source-map'
  9.   } 
  10.  
  11.   if (argv.mode === 'production') { 
  12.     //... 
  13.   } 
  14.  
  15.   return config; 
  16. }; 

其它常用配置:

  1. module.exports = { 
  2.     // 解析模塊的規則: 
  3.     resolve: { 
  4.         // 配置 解析模塊路徑別名:可簡寫路徑。 
  5.         alias: { 
  6.             "@": path.resolve(__dirname, "src"
  7.         }, 
  8.         // 配置 省略文件路徑的后綴名。默認省略js和json。也是webpack默認認識的兩種文件類型 
  9.         extensions: [".js"".json"".css"], // 新加css文件 
  10.         // 告訴webpack解析模塊是去找哪個目錄 
  11.         // 該配置明確告訴webpack,直接去上一層找node_modules。 
  12.         modules: [path.resolve(__dirname, "../node_modules")], 
  13.     }, 
  14.     // devServer(開發環境下配置): 
  15.     devServer: { 
  16.         // 運行代碼的目錄 
  17.         contentBase: path.resolve(__dirname, "build"), 
  18.         // 為每個靜態文件開啟gzip壓縮 
  19.         compress: true
  20.         host: "localhost"
  21.         port: 5000, 
  22.         opentrue, // 自動打開瀏覽器 
  23.         hot: true, //開啟HMR功能 
  24.         // 設置代理 
  25.         proxy: { 
  26.             // 一旦devServer(5000端口)接收到/api/xxx的請求,就會用devServer起的服務把請求轉發到另外一個服務器(3000) 
  27.             // 以此來解決開發中的跨域問題 
  28.             api: { 
  29.                 target: "htttp://localhost:3000"
  30.                 // 發送請求時,請求路徑重寫:將/api/xxx  --> /xxx (去掉/api) 
  31.                 pathRewrite: { 
  32.                     "^api"""
  33.                 }, 
  34.             }, 
  35.         }, 
  36.     }, 
  37.  
  38.     // optimization(生產環境下配置) 
  39.     optimization: { 
  40.         // 提取公共代碼 
  41.         splitChunks: { 
  42.             chunks: "all"
  43.         }, 
  44.         minimizer: [ 
  45.             // 配置生產環境的壓縮方案:js和css 
  46.             new TerserWebpackPlugin({ 
  47.                 // 多進程打包 
  48.                 parallel: true
  49.                 terserOptions: { 
  50.                     // 啟動source-map 
  51.                     sourceMap: true
  52.                 }, 
  53.             }), 
  54.         ], 
  55.     }, 
  56. }; 

3參考文章

webpack官方文檔 

Webpack5.0學習總結-基礎篇

 

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2024-04-26 00:25:52

Rust語法生命周期

2021-08-05 06:54:05

流程控制default

2024-02-27 10:11:36

前端CSS@規則

2013-08-02 10:52:10

Android UI控件

2024-04-07 08:41:34

2024-06-12 00:00:05

2024-08-26 10:01:50

2010-08-25 01:59:00

2011-12-02 09:22:23

網絡管理NetQos

2013-10-16 14:18:02

工具圖像處理

2023-04-06 09:08:41

BPM流程引擎

2019-07-24 15:30:00

SQL注入數據庫

2021-05-20 11:17:49

加密貨幣區塊鏈印度

2020-02-21 08:45:45

PythonWeb開發框架

2021-10-29 09:32:33

springboot 靜態變量項目

2023-09-06 18:37:45

CSS選擇器符號

2023-04-03 08:30:54

項目源碼操作流程

2023-09-26 00:29:40

CSS布局標簽

2009-04-02 10:17:00

交換機產品選購

2020-10-19 06:43:53

Redis腳本原子
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 紧缚调教一区二区三区视频 | 午夜精品视频一区 | 欧美成人影院 | 成人三级视频 | 男女又爽又黄视频 | 日韩字幕一区 | 久久综合亚洲 | aaa级片| 国产999精品久久久久久 | 国产成人精品一区二区三区 | 色偷偷888欧美精品久久久 | 久久精品国产一区二区电影 | 一区二区精品 | 超碰婷婷| 日韩在线一区二区三区 | 成人av网页 | 18av在线播放| 精品99爱视频在线观看 | 在线观看国产www | 91一区 | 久草热播| 亚洲成人综合网站 | 国产精品爱久久久久久久 | 日韩在线电影 | 亚洲一区二区三区在线 | 久久99网| 久久精品久久久久久 | 精品久久电影 | 成人无遮挡毛片免费看 | 欧美 视频| 九九久久久 | 精品国产18久久久久久二百 | 男女午夜激情视频 | 精品一区二区三区四区 | 午夜免费视频 | 欧美成人精品欧美一级 | 欧美日韩1区2区3区 欧美久久一区 | 午夜理伦三级理论三级在线观看 | 免费看爱爱视频 | 成人免费视频网站在线看 | 婷婷中文在线 |