冷たいご飯のシリーズを炒めます--10分url-loaderをやり遂げます
テキストアドレス
url-loaderとは
いつ使いますか.
一般的には、画像やフォントファイルを取得するように要求します.画像ファイルが多い場合(例えば、いくつかの
使用方法
1.取付
2.構成
3.
簡単に3歩で終わりました.
4.奇跡を目撃した時
では、
このモジュールが導出したのは標準の
標準のDataURL:
このの利点:要求を節約し、ページのパフォーマンスを向上させる 欠点:ローカルファイルサイズを大きくし、ロード性能を低下させる だから私たちは取捨選択をしなければならなくて、一部の小さい
options limit:ファイルサイズが を処理するファイルしきい値. fallback: です.
詳細についてはfile-loader
ソース解析
リファレンス url-loader file-loader file-loader repo
url-loaderとは
url-loader
は、導入されたファイルを符号化し、DataURL
を生成し、ファイルを一連の文字列に翻訳し、この文字列をJavaScript
にパッケージすることに相当する.いつ使いますか.
一般的には、画像やフォントファイルを取得するように要求します.画像ファイルが多い場合(例えば、いくつかの
icon
)、頻繁に要求を何度も送信する必要はありません.この場合、これらの小さなピクチャをローカルに配置し、url-loader
を使用してこれらのピクチャをbase64
によってコードに導入することを考慮することができる.これにより、リクエスト回数が節約され、ページのパフォーマンスが向上します.使用方法
1.取付
url-loader
npm install url-loader --save-dev
2.構成
webapck
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {},
},
],
},
],
},
};
3.
import
(またはrequire
)であってもよいファイルを導入するimport logo from '../assets/image/logo.png';
console.log('logo : ', logo); // logo
簡単に3歩で終わりました.
4.奇跡を目撃した時
webpack
webpack
が実行されると、dist
ディレクトリは1つのbundle.js
しか生成されません.file-loader
とは異なり、私たちが導入した画像は生成されません.前述したように、url-loader
は、ピクチャをDataURL
に変換し、JavaScript
コードにパッケージ化する.では、
bundle.js
に必要なDataURL
があるかどうかを見てみましょう.// bundle.js
(function(module, exports) {
module.exports = "data:image/jpeg;base64.........."; //
})
このモジュールが導出したのは標準の
DataURL
であることがわかります.標準のDataURL:
data:[][;base64],
この
DataURL
により、この画像をローカルからロードすることができ、dist
ディレクトリにパッケージする必要はありません.base64
を使用して画像をロードするのも両面性があります.size
のピクチャーに対してbase64
符号化を行って、その他の大きいピクチャーはやはり要求を出しましょう.url-loader
はもちろんすでにこのことをしており、簡単な構成で上記のニーズを実現することができます.options
limit
より大きいときにfallback
のloader
を使用してファイルloader
より大きいファイルを処理するためにlimit
を指定します.デフォルトはfile-loader
limit
を設定してみましょう.{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1000, // 1000 bytes fallback
},
},
],
},
webpack
を再実行します.logo.png
は1000
より大きいので、file-loader
を使用してこのファイルを処理します.画像はdist
ディレクトリにパッケージされ、返される値はアドレスです.(function(module, exports, __webpack_require__) {
module.exports = __webpack_require__.p + "dab1fd6b179f2dd87254d6e0f9f8efab.png";
}),
詳細についてはfile-loader
ソース解析
file-loader
のコードも多くなく、直接コピーして注釈で説明しました.import { getOptions } from 'loader-utils'; // loader
import validateOptions from 'schema-utils'; // schema
import mime from 'mime';
import normalizeFallback from './utils/normalizeFallback'; // fallback loader
import schema from './options.json'; // options schema
//
/*
*@method shouldTransform
*@param {Number|Boolean|String} limit
*@param {Number} size
*@return {Boolean}
*/
function shouldTransform(limit, size) {
if (typeof limit === 'boolean') {
return limit;
}
if (typeof limit === 'number' || typeof limit === 'string') {
return size <= parseInt(limit, 10);
}
return true;
}
export default function loader(src) {
// webpack options
const options = getOptions(this) || {};
// options
validateOptions(schema, options, {
name: 'URL Loader',
baseDataPath: 'options',
});
// , ,
// src Buffer, src.length
if (shouldTransform(options.limit, src.length)) {
const file = this.resourcePath;
// MIME , , "image/jpeg"
const mimetype = options.mimetype || mime.getType(file);
// src Buffer, Buffer
if (typeof src === 'string') {
src = Buffer.from(src);
}
// DataURL
return `module.exports = ${JSON.stringify(
`data:${mimetype || ''};base64,${src.toString('base64')}`
)}`;
}
// url-loader DataURL, fallback loader
const {
loader: fallbackLoader,
options: fallbackOptions,
} = normalizeFallback(options.fallback, options);
// fallback loader
const fallback = require(fallbackLoader);
// fallback loader
const fallbackLoaderContext = Object.assign({}, this, {
query: fallbackOptions,
});
// fallback loader src
return fallback.call(fallbackLoaderContext, src);
}
// webpack UTF8 , loader , raw true
export const raw = true;
リファレンス