Webpack === ###### tags: `frontend & backend` ###### tags: `frontend & backend`, `webpack` <br> [TOC] <br> ## webpack version ```bash $ webpack -v webpack: 5.65.0 webpack-cli: 4.9.1 webpack-dev-server not installed ``` <br> ## [Loaders](https://webpack.js.org/concepts/#loaders) <br> ## [file-loader](https://v4.webpack.js.org/loaders/file-loader/) - ### 安裝 ``` $ npm install file-loader --save-dev ``` - ### file.js ```javascript= import img from './file.png'; ``` - ### webpack.config.js ```javascript= module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', }, ], }, ], }, }; ``` - ### 執行 ``` $ webpack ``` ### 參考資料 - ### [Webpack 前端打包工具 - 使用 url-loader 與 file-loader 處理靜態資源](https://awdr74100.github.io/2020-03-09-webpack-urlloader-fileloader/) - **url-loader 功能** 將資源轉換為 base64 的格式 - **轉為 base64 好處** 網頁在渲染圖片時,不需要以 request 的方式加載圖片,直接向 JavaScript 檔案拿取即可,這樣子以效能來說,會提高許多 - **base64 限制** 不能把檔案大小的上限設定太高,由於 base64 是存在於 bundle.js 內,這樣子的做法會導致 JavaScript 異常的肥大,對於效能來說反而會下降 - **file-loader 功能** 用以將靜態資源載入到 Webpack 內,並且解析資源的相互依賴關係,最後 output 到指定的位置 - **如何引入打包而成的 bundle.js 與 main.css?** ```html= <!-- 其他省略 --> <head> <!-- 引入打包生成的 CSS --> <link rel="stylesheet" href="dist/css/main.css" /> </head> <body> <div class="banner w-100-h-100 bg-cover"></div> <div class="logo w-100-h-100 bg-cover"></div> <!-- 引入打包生成的 JavaScript --> <script src="dist/js/bundle.js"></script> </body> ``` - **font 字體可以使用 url-loader 處理嗎?** 答案是可以的,但非常不建議這樣做,英文字體少說 150 KB 起跳,而中文字體則是 5MB 起跳,對於網頁的效能來說,會有非常大的影響,這也是之前提到的 url-loader 中 limit 選項需要自己去衡量的原因,一般來說 8KB 左右就是極限了,超過的檔案就都建議以 file-loader 進行處理 ### Q & A - ### [Module not found: Error: Cannot resolve module '***.jpg'](https://stackoverflow.com/questions/42413859/) <br> <hr> <br> ## ts-loader - ### [webpack ts-loader error : loaderContext.getOptions is not a function](https://stackoverflow.com/questions/68016372) ```json= module: { rules: [ { test: /\.ts$/, include: [source_path], loader: 'ts-loader', exclude: /node_modules/, }], }, ``` - ### [Error at typescript compilation with webpack](https://stackoverflow.com/questions/50634229) ```json= module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ } ] } ``` - ### [Webpack ts-loader : change tsconfig filename](https://stackoverflow.com/questions/40426378) ```json= module: { rules: [ { test: /\.ts$/, use: [{ loader: 'ts-loader', options: { configFile: "tsconfig.webpack.json" } }], exclude: /node_modules/, } ] }, ``` - ### [Import raw files from typescript with webpack using the `import` statement](https://coderedirect.com/questions/286685/import-raw-files-from-typescript-with-webpack-using-the-import-statement) ``` $ tree . +-- file.txt +-- main.ts +-- package.json +-- tsconfig.json +-- webpack.config.js ``` - ### [Importing images in TypeScript React - "Cannot find module"](https://stackoverflow.com/questions/52759220/) - ### [How to use es6 import for images](https://stackoverflow.com/questions/39458511/) <br> <hr> <br> ## Q & A - ### 更多範例 - [TypeStrong / ts-loader / examples / vanilla](https://github.com/TypeStrong/ts-loader/tree/main/examples/vanilla) :+1: :100: - ### [Cannot find module 'webpack-cli'](https://stackoverflow.com/questions/49855472) ``` $ npm i -g webpack-cli ``` - `i`: [install](https://docs.npmjs.com/cli/v8/commands/npm-install) - `-g`: [global](https://docs.npmjs.com/cli/v8/commands/npm-install) <br> <hr> <br> ## 教學資料 - ### [Webpack 前端打包工具 - 使用 url-loader 與 file-loader 處理靜態資源](https://awdr74100.github.io/2020-03-09-webpack-urlloader-fileloader/) - ### [Webpack 簡介 :zap:](https://neighborhood999.github.io/webpack-tutorial-gitbook/Part1/)