webpack 開發(fā)體驗問題

自動編譯

  • watch模式,監(jiān)聽文件變化,自動編譯打包。命令行方式通過--watch

yarn webpack --watch

自動刷新瀏覽器,配合HotModuleReplacementPlugin插件

  • browserSync為例:

browser-sync dist --files "*/"

  • webpack-dev-server,官方推出的開發(fā)工具,提供開發(fā)服務(wù)器。集成自動編譯和自動刷新瀏覽器等功能
  1. 安裝webpack-dev-server,為項目安裝了webpack-dev-server-cli
  2. 命令行啟動

yarn webpack-dev-server // 自動使用webpack打包,并啟動http server運行打包結(jié)果,還能監(jiān)聽文件變化,跟watch模式一樣。

webpack為了提高打包效率,沒有寫到磁盤,而是寫到了內(nèi)存里。所以啟動webpack-dev-server后是看不到打包的dist目錄的,這樣減少了磁盤操作,大大提高了構(gòu)建效率

yarn webpack-dev-server --open // 自動打開瀏覽器

webpack dev server靜態(tài)資源訪問

  • webpack dev server 只要是webpack打包輸出的文件,都可以直接被訪問。但是,如果有些其他靜態(tài)也需要serve,就需要告知webpack dev server
  • 具體方法是,在webpack.config.js里面新增配置

module.exports = {
    ......
   devServer: {
    contentBase: './public', // 指定額外的靜態(tài)資源路徑,可以是字符串或則數(shù)組
    hot: true,
    open: true,
    ......
    },
  },
  ......
  plugins: [
    ......
    // 開發(fā)階段最好不要使用這個插件,因為使用了webpack-dev-server的話,通過contentBase指定了該開發(fā)文件夾里
    // 上線的時候再使用,防止頻繁重復(fù)的打包時,每次都執(zhí)行這個插件,這樣開銷就很大,構(gòu)建效率就很低了
    // new CopyWebpackPlugin(['public'])
  ],
}

webpack dev server 代理API

devServer的proxy字段

proxy: {
      '/api': {
        // http://localhost:8080/api/users -> https://api.github.com/api/users
        target: 'https://api.github.com',
        // http://localhost:8080/api/users -> https://api.github.com/users
        pathRewrite: {
          '^/api': '',
        },
        // 不能使用 localhost:8080 作為請求 GitHub 的主機名
        // 因為默認是dev-server通過localhost:8080這個主機名去訪問目標主機,設(shè)為true
        // 一般服務(wù)器那邊一般通過主機名去判斷這個請求屬于哪個網(wǎng)站,然后把這個請求給到那個網(wǎng)站
        // 主機名是HTTP協(xié)議中的相關(guān)概念
        changeOrigin: true, // 這個字段說明看https://github.com/iuap-design/blog/issues/260
      },
    },

source map 源代碼地圖

  • 維持轉(zhuǎn)換后的代碼和源代碼之間的映射關(guān)系
  • source map解決了源代碼與運行代碼不一致所產(chǎn)生的問題。

一般有三個文件,一個是混淆壓縮后的代碼.min.js,源文件.js,source map文件***.min.map(里面的sources數(shù)組,指向源文件),min.js最后一行有下面這一行固定格式

//# sourceMappingURL=jquery-3.4.1.min.map

webpack 配置source map

  • webpack 支持12種不同方式的source map


    屏幕快照 2021-06-29 23.30.41.png
  • 每種方式的效率和效果各不相同
    那應(yīng)該使用哪一種呢?

  1. eval模式,eval是js函數(shù),可以通過字符串運行js代碼
    運行時,是另外開一個虛擬機的方式運行里面的js代碼
    在eval后面添加 //# sourceURL=./foo/bar.js。那么它的運行環(huán)境就變成foo/bar.js。意味這可以通過sourceURL改變eval運行環(huán)境的名稱,但其實它還是運行在虛擬機環(huán)境當(dāng)中,只不過告訴了執(zhí)行引擎這個執(zhí)行代碼的執(zhí)行路徑,這只是個標識。


    屏幕快照 2021-06-29 23.35.33.png

devtool: eval打包后,不會生產(chǎn)sourcemap文件,只是在每個模塊的eval最后面添加 文件路徑,告訴引擎,報錯的是哪個文件。所以它的構(gòu)建速度是最快的,但是效果是最差的,沒有報錯的行列信息。

屏幕快照 2021-06-29 23.42.28.png

webpack devtool模式對比

1、eval、eval-source-map(有行有列)、cheap-eval-source-map(只有行沒有列,映射loader處理后的)、cheap-module-eval-source-map(只有行沒有列,但是映射的是源碼)

  • eval -是否使用eval執(zhí)行代碼模塊
  • cheap - Source Map是否包含行信息
  • module - 是否能夠得到Loader處理之前的源代碼
    2、inline -- source map:使用的是dataUrl的方式嵌入到代碼當(dāng)中,這種是最不可能用到的。
    3、hidden --source map,構(gòu)建后的代碼沒有通過注釋的方式引用source map。
    4、nosources 能看到錯誤的文件,但是沒有源代碼,只有行列信息,在開發(fā)者工具點擊錯誤的時候,不會找到源代碼,這樣是保護我們的源代碼。

webpack選擇Source Map模式(建議)

1、開發(fā)環(huán)境下會選擇:cheap-module-eval-source-map

  • 我的代碼每行不會超過80個字符,那這樣定位到行就夠了
  • 我的代碼經(jīng)過Loader轉(zhuǎn)換過后的差異較大,例如使用了Vue之類的框架
  • 雖然這種模式打包啟動的速度慢些,但是首次打包速度慢無所謂,項目使用webpack-dev-server以監(jiān)視模式打包,而不是啟動打包,重寫打包相對較快。
    2、生產(chǎn)模式的打包:選擇none,如果真的有必要可以使用nosources-source-map,只暴露源代碼的位置,而不是暴露內(nèi)容
  • Source Map會暴露源代碼,會被稍有技術(shù)的人,很容易泄露代碼
  • 調(diào)試是開發(fā)階段的事情

webpack 自動刷新的問題,局部刷新不是reload

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容