149 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
<div align="center">
 | 
						|
  <a href="https://webpack.js.org/">
 | 
						|
    <img width="200" height="200" vspace="" hspace="25" src="https://cdn.rawgit.com/webpack/media/e7485eb2/logo/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]
 | 
						|
 | 
						|
# thread-loader
 | 
						|
 | 
						|
Runs the following loaders in a worker pool.
 | 
						|
 | 
						|
## Getting Started
 | 
						|
 | 
						|
```bash
 | 
						|
npm install --save-dev thread-loader
 | 
						|
```
 | 
						|
 | 
						|
Put this loader in front of other loaders. The following loaders run in a worker pool.
 | 
						|
 | 
						|
Loaders running in a worker pool are limited. Examples:
 | 
						|
 | 
						|
- Loaders cannot emit files.
 | 
						|
- Loaders cannot use custom loader API (i. e. by plugins).
 | 
						|
- Loaders cannot access the webpack options.
 | 
						|
 | 
						|
Each worker is a separate node.js process, which has an overhead of ~600ms. There is also an overhead of inter-process communication.
 | 
						|
 | 
						|
Use this loader only for expensive operations!
 | 
						|
 | 
						|
### Examples
 | 
						|
 | 
						|
**webpack.config.js**
 | 
						|
 | 
						|
```js
 | 
						|
module.exports = {
 | 
						|
  module: {
 | 
						|
    rules: [
 | 
						|
      {
 | 
						|
        test: /\.js$/,
 | 
						|
        include: path.resolve('src'),
 | 
						|
        use: [
 | 
						|
          'thread-loader',
 | 
						|
          // your expensive loader (e.g babel-loader)
 | 
						|
        ],
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
};
 | 
						|
```
 | 
						|
 | 
						|
**with options**
 | 
						|
 | 
						|
```js
 | 
						|
use: [
 | 
						|
  {
 | 
						|
    loader: 'thread-loader',
 | 
						|
    // loaders with equal options will share worker pools
 | 
						|
    options: {
 | 
						|
      // the number of spawned workers, defaults to (number of cpus - 1) or
 | 
						|
      // fallback to 1 when require('os').cpus() is undefined
 | 
						|
      workers: 2,
 | 
						|
 | 
						|
      // number of jobs a worker processes in parallel
 | 
						|
      // defaults to 20
 | 
						|
      workerParallelJobs: 50,
 | 
						|
 | 
						|
      // additional node.js arguments
 | 
						|
      workerNodeArgs: ['--max-old-space-size=1024'],
 | 
						|
 | 
						|
      // Allow to respawn a dead worker pool
 | 
						|
      // respawning slows down the entire compilation
 | 
						|
      // and should be set to false for development
 | 
						|
      poolRespawn: false,
 | 
						|
 | 
						|
      // timeout for killing the worker processes when idle
 | 
						|
      // defaults to 500 (ms)
 | 
						|
      // can be set to Infinity for watching builds to keep workers alive
 | 
						|
      poolTimeout: 2000,
 | 
						|
 | 
						|
      // number of jobs the poll distributes to the workers
 | 
						|
      // defaults to 200
 | 
						|
      // decrease of less efficient but more fair distribution
 | 
						|
      poolParallelJobs: 50,
 | 
						|
 | 
						|
      // name of the pool
 | 
						|
      // can be used to create different pools with elsewise identical options
 | 
						|
      name: 'my-pool',
 | 
						|
    },
 | 
						|
  },
 | 
						|
  // your expensive loader (e.g babel-loader)
 | 
						|
];
 | 
						|
```
 | 
						|
 | 
						|
**prewarming**
 | 
						|
 | 
						|
To prevent the high delay when booting workers it possible to warmup the worker pool.
 | 
						|
 | 
						|
This boots the max number of workers in the pool and loads specified modules into the node.js module cache.
 | 
						|
 | 
						|
```js
 | 
						|
const threadLoader = require('thread-loader');
 | 
						|
 | 
						|
threadLoader.warmup(
 | 
						|
  {
 | 
						|
    // pool options, like passed to loader options
 | 
						|
    // must match loader options to boot the correct pool
 | 
						|
  },
 | 
						|
  [
 | 
						|
    // modules to load
 | 
						|
    // can be any module, i. e.
 | 
						|
    'babel-loader',
 | 
						|
    'babel-preset-es2015',
 | 
						|
    'sass-loader',
 | 
						|
  ]
 | 
						|
);
 | 
						|
```
 | 
						|
 | 
						|
## 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/thread-loader.svg
 | 
						|
[npm-url]: https://npmjs.com/package/thread-loader
 | 
						|
[node]: https://img.shields.io/node/v/thread-loader.svg
 | 
						|
[node-url]: https://nodejs.org
 | 
						|
[deps]: https://david-dm.org/webpack-contrib/thread-loader.svg
 | 
						|
[deps-url]: https://david-dm.org/webpack-contrib/thread-loader
 | 
						|
[tests]: https://github.com/webpack-contrib/thread-loader/workflows/thread-loader/badge.svg
 | 
						|
[tests-url]: https://github.com/webpack-contrib/thread-loader/actions
 | 
						|
[cover]: https://codecov.io/gh/webpack-contrib/thread-loader/branch/master/graph/badge.svg
 | 
						|
[cover-url]: https://codecov.io/gh/webpack-contrib/thread-loader
 | 
						|
[chat]: https://badges.gitter.im/webpack/webpack.svg
 | 
						|
[chat-url]: https://gitter.im/webpack/webpack
 | 
						|
[size]: https://packagephobia.now.sh/badge?p=thread-loader
 | 
						|
[size-url]: https://packagephobia.now.sh/result?p=thread-loader
 |