91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Webpack loader之file-loader怎么用

發布時間:2021-08-26 14:47:11 來源:億速云 閱讀:144 作者:小新 欄目:web開發

這篇文章主要為大家展示了“Webpack loader之file-loader怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Webpack loader之file-loader怎么用”這篇文章吧。

簡介

安裝

npm install --save-dev file-loader

用法

默認情況下,生成的文件的文件名就是文件內容的 MD5 哈希值并會保留所引用資源的原始擴展名。

import img from './webpack-logo.png'

webpack.config.js

module.exports = {
 module: {
  rules: [
   {
    test: /\.(png|jpg|gif)$/,
    use: [
     {
      loader: 'file-loader',
      options: {}
     }
    ]
   }
  ]
 }
}

生成文件 bd62c377ad80f89061ea5ad8829df35b.png (默認的文件名為 [hash].[ext]),輸出到輸出目錄并返回 public URL。

"/public/path/bd62c377ad80f89061ea5ad8829df35b.png"

當然如果不想使用默認的文件名,我們也可以通過配置 options.name 選項來設置輸出的文件名命名規則,需要注意的是 name 選項支持的類型為: {String|Function}

String 類型

webpack.config.js

{
 loader: 'file-loader',
 options: {
  name: '[path][name].[ext]'
 }
}

Function 類型

webpack.config.js

{
 loader: 'file-loader',
 options: {
  name (file) {
   if (env === 'development') {
    return '[path][name].[ext]'
   }
   return '[hash].[ext]'
  }
 }
}

以上的示例中,我們使用了 [path][name][hash][ext] 占位符,它們對應的含義是:

  • [ext]:String,默認值為 file.extname,表示資源擴展名;

  • [name]:String,默認值為 file.basename,表示資源的基本名稱;

  • [path]:String,默認值為 file.dirname,表示資源相對于 context 的路徑;

  • [hash]:String,默認值為 md5,內容的哈希值,支持靈活的 hashes 配置,配置規則為:[<hashType>:hash:<digestType>:<length>],對應的說明如下:

Webpack loader之file-loader怎么用

其實除了以上常用的四個占位符之外,還有支持 [N] ,N 是數值類型,表示當前文件名按照查詢參數 regExp 匹配后獲得到第 N 個匹配結果。介紹完 name 配置項,接下來我們來繼續介紹幾個常用的配置。

常用配置項 outputPath

outputPath 用于配置自定義 output 輸出目錄,支持 String|Function 類型,默認值為 ‘undefined',用法如下:

webpack.config.js

{
 loader: 'file-loader',
 options: {
  name: '[path][name].[ext]',
  outputPath: 'images/'
 }
}

需要注意的是,outputPath 所設置的路徑,是相對于 webpack 的輸出目錄。

publicPath

publicPath 用于配置自定義 public 發布目錄,支持 String|Function 類型,默認值為 __webpack_public__path__ ,用法如下:

webpack.config.js

{
 loader: 'file-loader',
 options: {
  name: '[path][name].[ext]',
  publicPath: 'assets/'
 }
}

emitFile

emitFile 用于設置是否生成文件,類型是 Boolean,默認值為 true。但我們可以通過將 emitFile 設置為 false 來禁用該默認行為。

webpack.config.js

{
 loader: 'file-loader',
 options: {
  emitFile: false
 }
}

outputPath vs publicPath

outputPath 僅僅告訴 webpack 結果存儲在哪里,然而 publicPath 選項則被許多 webpack 的插件用于在生產模式下更新內嵌到 css、html 文件內的 url 值。例如:

// Development: Both Server and the image are on localhost
.image { 
 background-image: url('./test.png');
 }
 
// Production: Server is on Heroku but the image is on a CDN
.image { 
 background-image: url('https://some-cdn/test.png');
 }

loader 準則

編寫 loader 時應該遵循以下準則:

  • 簡單易用。

  • 使用鏈式傳遞。

  • 模塊化的輸出。

  • 確保無狀態。

  • 使用 loader utilities。

  • 記錄 loader 的依賴。

  • 解析模塊依賴關系。

  • 提取通用代碼。

  • 避免絕對路徑。

  • 使用 peer dependencies。

以上的準則按重要程度排序,但某些僅適用于某些場景。若想進一步了解自定義 loader,可以閱讀 編寫一個 loader 這個文檔。接下來,我們來基于上述的準則分析一下 file-loader 的源碼。

file-loader 源碼簡析

所謂 loader 只是一個導出為函數對象的 JavaScript 模塊。 loader runner 會調用這個函數,然后把上一個 loader 產生的結果或者資源文件傳入進去。 函數的 this 上下文將由 webpack 填充,并且 loader runner 具有一些有用方法,可以使 loader 改變為異步調用方式,或者獲取 query 參數 。

其實本文介紹的 file-loader 并不會對文件的內容進行任何轉換,只是復制一份文件內容,并根據相關的配置生成對應的文件名,所生成的文件名一般會帶上 hash 值,從而避免文件重名導致沖突。接下來我們來簡單分析一下 file-loader 的部分源碼。

導入依賴模塊

import path from 'path';

import loaderUtils from 'loader-utils';
import validateOptions from 'schema-utils';

import schema from './options.json';

獲取配置對象及驗證

export default function loader(content) {
 if (!this.emitFile)
  throw new Error('File Loader\n\nemitFile is required from module system');

 const options = loaderUtils.getOptions(this) || {};

 validateOptions(schema, options, 'File Loader');
}

以上代碼中,emitFile 是由 loader 上下文提供的方法,用于輸出一個文件,對應的函數簽名如下:

emitFile(name: string, content: Buffer|string, sourceMap: {...})

在調用 file-loader 時,如果發現 this.emitFile 無效,則會拋出異常。接著 file-loader 會先調用 loaderUtils.getOptions() 方法,獲取當前 loader 對應的配置對象,然后基于已定義的 Schema,驗證配置對象的有效性。對應的 Schema 定義如下(不包含異常提示信息):

{
 "type": "object",
 "properties": {
  "name": {},
  "regExp": {},
  "context": {
   "type": "string"
  },
  "publicPath": {},
  "outputPath": {},
  "useRelativePath": {
   "type": "boolean"
  },
  "emitFile": {
   "type": "boolean"
  }
 },
 "additionalProperties": true
}

獲取 context 及生成文件名稱

const context = 
  options.context //自定義文件context
  // 從webpack 4開始,原先的this.options.context
  // 被改進為this.rootContext
  || this.rootContext || 
  (this.options && this.options.context);

const url = loaderUtils.interpolateName(
 this, 
 options.name, // 默認為"[hash].[ext]"
 {
  context,
  content,
  regExp: options.regExp,
});

loaderUtils 中的 interpolateName 方法,用于生成對應的文件名,該方法的簽名如下:

interpolateName(loaderContext, name, options);

其中 loaderContext 為 loader 的上下文對象,name 為文件名稱模板,options 為配置對象,支持 context,content 和 regExp 屬性。該方法的使用示例如下:

示例一:

// loaderContext.resourcePath = "/app/js/javascript.js";
let interpolatedName = loaderUtils.interpolateName(
 loaderContext, 
 "js/[hash].script.[ext]", 
 {
   content: "console.log('loaderUtils')"
 });
// => js/e353f4da4c3e380646d2b4d75c8a13ab.script.js

以上示例核心的處理流程如下:

Webpack loader之file-loader怎么用

示例二:

// loaderContext.resourcePath = "/app/js/page-home.js"
loaderUtils.interpolateName(
 loaderContext, 
 "script-[1].[ext]", 
 { 
 regExp: "page-(.*)\\.js", 
 content: "console.log('loaderUtils')"
 });
// => script-home.js

處理 outputPath

let outputPath = url;

if (options.outputPath) {
  if (typeof options.outputPath === 'function') {
   outputPath = options.outputPath(url);
  } else {
   outputPath = path.posix.join(options.outputPath, url);
  }
}

處理 publicPath

// __webpack_require__.p = "";
let publicPath = `__webpack_public_path__ + ${JSON.stringify(outputPath)}`;

if (options.publicPath) {
  if (typeof options.publicPath === 'function') {
   publicPath = options.publicPath(url);
  } else if (options.publicPath.endsWith('/')) {
   publicPath = options.publicPath + url;
  } else {
   publicPath = `${options.publicPath}/${url}`;
  }

  publicPath = JSON.stringify(publicPath);
}

處理 emitFile

if (options.emitFile === undefined || options.emitFile) {
  // 把文件輸出到指定的outputPath路徑
  this.emitFile(outputPath, content); 
}

導出最終路徑

return `module.exports = ${publicPath};`;

以上是“Webpack loader之file-loader怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖安县| 沾化县| 新兴县| 子长县| 太白县| 色达县| 泰宁县| 中西区| 宿州市| 永福县| 泽普县| 四会市| 江孜县| 深州市| 扬中市| 南乐县| 布拖县| 介休市| 锡林郭勒盟| 上虞市| 尉氏县| 台前县| 南靖县| 平潭县| 南京市| 崇义县| 正定县| 阿坝| 彭州市| 宜都市| 伊春市| 林西县| 彭阳县| 菏泽市| 出国| 重庆市| 新源县| 监利县| 太白县| 通榆县| 华亭县|