| <div align="center"> |
| <a href="https://github.com/webpack/webpack"> |
| <img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg"> |
| </a> |
| </div> |
| |
| [![npm][npm]][npm-url] |
| [![node][node]][node-url] |
| [![deps][deps]][deps-url] |
| [![tests][tests]][tests-url] |
| [![coverage][cover]][cover-url] |
| [![chat][chat]][chat-url] |
| [![size][size]][size-url] |
| |
| # file-loader |
| |
| The `file-loader` resolves `import`/`require()` on a file into a url and emits the file into the output directory. |
| |
| ## Getting Started |
| |
| To begin, you'll need to install `file-loader`: |
| |
| ```console |
| $ npm install file-loader --save-dev |
| ``` |
| |
| Import (or `require`) the target file(s) in one of the bundle's files: |
| |
| **file.js** |
| |
| ```js |
| import img from './file.png'; |
| ``` |
| |
| Then add the loader to your `webpack` config. For example: |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: {}, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| And run `webpack` via your preferred method. This will emit `file.png` as a file |
| in the output directory (with the specified naming convention, if options are |
| specified to do so) and returns the public URI of the file. |
| |
| > ℹ️ By default the filename of the resulting file is the hash of the file's contents with the original extension of the required resource. |
| |
| ## Options |
| |
| ### `name` |
| |
| Type: `String|Function` |
| Default: `'[hash].[ext]'` |
| |
| Specifies a custom filename template for the target file(s) using the query |
| parameter `name`. For example, to emit a file from your `context` directory into |
| the output directory retaining the full directory structure, you might use: |
| |
| #### `String` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| name: '[path][name].[ext]', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| #### `Function` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| name(file) { |
| if (process.env.NODE_ENV === 'development') { |
| return '[path][name].[ext]'; |
| } |
| |
| return '[hash].[ext]'; |
| }, |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| > ℹ️ By default the path and name you specify will output the file in that same directory, and will also use the same URI path to access the file. |
| |
| ### `outputPath` |
| |
| Type: `String|Function` |
| Default: `undefined` |
| |
| Specify a filesystem path where the target file(s) will be placed. |
| |
| #### `String` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| outputPath: 'images', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| #### `Function` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| outputPath: (url, resourcePath, context) => { |
| // `resourcePath` is original absolute path to asset |
| // `context` is directory where stored asset (`rootContext`) or `context` option |
| |
| // To get relative path you can use |
| // const relativePath = path.relative(context, resourcePath); |
| |
| if (/my-custom-image\.png/.test(resourcePath)) { |
| return `other_output_path/${url}`; |
| } |
| |
| if (/images/.test(context)) { |
| return `image_output_path/${url}`; |
| } |
| |
| return `output_path/${url}`; |
| }, |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| ### `publicPath` |
| |
| Type: `String|Function` |
| Default: [`__webpack_public_path__`](https://webpack.js.org/api/module-variables/#__webpack_public_path__-webpack-specific-) |
| |
| Specifies a custom public path for the target file(s). |
| |
| #### `String` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| publicPath: 'assets', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| #### `Function` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| publicPath: (url, resourcePath, context) => { |
| // `resourcePath` is original absolute path to asset |
| // `context` is directory where stored asset (`rootContext`) or `context` option |
| |
| // To get relative path you can use |
| // const relativePath = path.relative(context, resourcePath); |
| |
| if (/my-custom-image\.png/.test(resourcePath)) { |
| return `other_public_path/${url}`; |
| } |
| |
| if (/images/.test(context)) { |
| return `image_output_path/${url}`; |
| } |
| |
| return `public_path/${url}`; |
| }, |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| ### `context` |
| |
| Type: `String` |
| Default: [`context`](https://webpack.js.org/configuration/entry-context/#context) |
| |
| Specifies a custom file context. |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| context: 'project', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| ### `emitFile` |
| |
| Type: `Boolean` |
| Default: `true` |
| |
| If true, emits a file (writes a file to the filesystem). If false, the loader |
| will return a public URI but **will not** emit the file. It is often useful to |
| disable this option for server-side packages. |
| |
| **file.js** |
| |
| ```js |
| // bundle file |
| import img from './file.png'; |
| ``` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.css$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| emitFile: false, |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| ### `regExp` |
| |
| Type: `RegExp` |
| Default: `undefined` |
| |
| Specifies a Regular Expression to one or many parts of the target file path. |
| The capture groups can be reused in the `name` property using `[N]` |
| [placeholder](https://github.com/webpack-contrib/file-loader#placeholders). |
| |
| **file.js** |
| |
| ```js |
| import img from './customer01/file.png'; |
| ``` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| regExp: /\/([a-z0-9]+)\/[a-z0-9]+\.png$/, |
| name: '[1]-[name].[ext]', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| > ℹ️ If `[0]` is used, it will be replaced by the entire tested string, whereas `[1]` will contain the first capturing parenthesis of your regex and so on... |
| |
| ## Placeholders |
| |
| Full information about placeholders you can find [here](https://github.com/webpack/loader-utils#interpolatename). |
| |
| ### `[ext]` |
| |
| Type: `String` |
| Default: `file.extname` |
| |
| The file extension of the target file/resource. |
| |
| ### `[name]` |
| |
| Type: `String` |
| Default: `file.basename` |
| |
| The basename of the file/resource. |
| |
| ### `[path]` |
| |
| Type: `String` |
| Default: `file.directory` |
| |
| The path of the resource relative to the webpack/config `context`. |
| |
| ### `[folder]` |
| |
| Type: `String` |
| Default: `file.folder` |
| |
| The folder of the resource is in. |
| |
| ### `[emoji]` |
| |
| Type: `String` |
| Default: `undefined` |
| |
| A random emoji representation of `content`. |
| |
| ### `[emoji:<length>]` |
| |
| Type: `String` |
| Default: `undefined` |
| |
| Same as above, but with a customizable number of emojis |
| |
| ### `[hash]` |
| |
| Type: `String` |
| Default: `md5` |
| |
| Specifies the hash method to use for hashing the file content. |
| |
| ### `[<hashType>:hash:<digestType>:<length>]` |
| |
| Type: `String` |
| |
| The hash of options.content (Buffer) (by default it's the hex digest of the hash). |
| |
| #### `digestType` |
| |
| Type: `String` |
| Default: `'hex'` |
| |
| The [digest](https://en.wikipedia.org/wiki/Cryptographic_hash_function) that the |
| hash function should use. Valid values include: base26, base32, base36, |
| base49, base52, base58, base62, base64, and hex. |
| |
| #### `hashType` |
| |
| Type: `String` |
| Default: `'md5'` |
| |
| The type of hash that the has function should use. Valid values include: `md5`, |
| `sha1`, `sha256`, and `sha512`. |
| |
| #### `length` |
| |
| Type: `Number` |
| Default: `undefined` |
| |
| Users may also specify a length for the computed hash. |
| |
| ### `[N]` |
| |
| Type: `String` |
| Default: `undefined` |
| |
| The n-th match obtained from matching the current file name against the `regExp`. |
| |
| ## Examples |
| |
| The following examples show how one might use `file-loader` and what the result would be. |
| |
| **file.js** |
| |
| ```js |
| import png from './image.png'; |
| ``` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| name: 'dirname/[hash].[ext]', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| Result: |
| |
| ```bash |
| # result |
| dirname/0dcbbaa701328ae351f.png |
| ``` |
| |
| --- |
| |
| **file.js** |
| |
| ```js |
| import png from './image.png'; |
| ``` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| name: '[sha512:hash:base64:7].[ext]', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| Result: |
| |
| ```bash |
| # result |
| gdyb21L.png |
| ``` |
| |
| --- |
| |
| **file.js** |
| |
| ```js |
| import png from './path/to/file.png'; |
| ``` |
| |
| **webpack.config.js** |
| |
| ```js |
| module.exports = { |
| module: { |
| rules: [ |
| { |
| test: /\.(png|jpe?g|gif)$/, |
| use: [ |
| { |
| loader: 'file-loader', |
| options: { |
| name: '[path][name].[ext]?[hash]', |
| }, |
| }, |
| ], |
| }, |
| ], |
| }, |
| }; |
| ``` |
| |
| Result: |
| |
| ```bash |
| # result |
| path/to/file.png?e43b20c069c4a01867c31e98cbce33c9 |
| ``` |
| |
| ## Contributing |
| |
| Please take a moment to read our contributing guidelines if you haven't yet done so. |
| |
| [CONTRIBUTING](./.github/CONTRIBUTING.md) |
| |
| ## License |
| |
| [MIT](./LICENSE) |
| |
| [npm]: https://img.shields.io/npm/v/file-loader.svg |
| [npm-url]: https://npmjs.com/package/file-loader |
| [node]: https://img.shields.io/node/v/file-loader.svg |
| [node-url]: https://nodejs.org |
| [deps]: https://david-dm.org/webpack-contrib/file-loader.svg |
| [deps-url]: https://david-dm.org/webpack-contrib/file-loader |
| [tests]: https://dev.azure.com/webpack-contrib/file-loader/_apis/build/status/webpack-contrib.file-loader?branchName=master |
| [tests-url]: https://dev.azure.com/webpack-contrib/file-loader/_build/latest?definitionId=2&branchName=master |
| [cover]: https://codecov.io/gh/webpack-contrib/file-loader/branch/master/graph/badge.svg |
| [cover-url]: https://codecov.io/gh/webpack-contrib/file-loader |
| [chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg |
| [chat-url]: https://gitter.im/webpack/webpack |
| [size]: https://packagephobia.now.sh/badge?p=file-loader |
| [size-url]: https://packagephobia.now.sh/result?p=file-loader |