What is copy-webpack-plugin?
The copy-webpack-plugin is a webpack plugin that allows you to copy files and directories from one location to another within your build process. It is commonly used to copy static assets such as images, fonts, and HTML files to the output directory defined in your webpack configuration.
What are copy-webpack-plugin's main functionalities?
Copying individual files or entire directories
This feature allows you to copy individual files or entire directories from a specified source to a destination within your output directory. The 'from' field specifies the relative or absolute path to the source file or directory, and the 'to' field specifies the relative path to the destination within the output directory.
new CopyPlugin({ patterns: [{ from: 'source', to: 'dest' }] })
Ignoring files
This feature allows you to exclude specific files or patterns from being copied. In the provided code sample, all JavaScript files are ignored and will not be copied to the destination.
new CopyPlugin({ patterns: [{ from: 'source', to: 'dest', globOptions: { ignore: ['**/*.js'] } }] })
Adding context to file paths
This feature allows you to specify a context for the file paths. The 'context' option sets a base path for the 'from' property. In the code sample, the actual path that will be copied is 'app/source'.
new CopyPlugin({ patterns: [{ from: 'source', to: 'dest', context: 'app' }] })
Transforming file content
This feature allows you to modify the content of files before they are copied. The 'transform' function receives the content of the file and its path, and it should return the new content. This can be used to minify files, add banners, or perform other transformations.
new CopyPlugin({ patterns: [{ from: 'source', to: 'dest', transform: (content, path) => { return modifyContent(content); } }] })
Other packages similar to copy-webpack-plugin
file-loader
The file-loader resolves import/require() on a file into a url and emits the file into the output directory. It is similar to copy-webpack-plugin in that it helps manage static assets, but it is more focused on handling assets within the module system.
html-webpack-plugin
The html-webpack-plugin simplifies the creation of HTML files to serve your webpack bundles. It can copy HTML files and automatically inject script tags for bundle files. It differs from copy-webpack-plugin by focusing on HTML files and their dependencies.
assets-webpack-plugin
The assets-webpack-plugin generates a JSON file with the assets produced by webpack. It is similar to copy-webpack-plugin in that it deals with the output of assets, but it does not copy files; instead, it provides a manifest of the generated assets.
Copy Webpack Plugin
Copies individual files or entire directories to the build directory.
Install
npm install --save-dev copy-webpack-plugin
Usage
new CopyWebpackPlugin([patterns], options)
A pattern looks like:
{ from: 'source', to: 'dest' }
Or, in the simple case of just a from
with the default destination, you can use a string primitive instead of an object:
'source'
Pattern properties:
Name | Required | Default | Details |
---|
from | Y | | examples: 'relative/file.txt' '/absolute/file.txt' 'relative/dir' '/absolute/dir' '**/*' {glob:'**/*', dot: true}
Globs accept minimatch options |
to | N | output root if from is file or dir
resolved glob path if from is glob | examples: 'relative/file.txt' '/absolute/file.txt' 'relative/dir' '/absolute/dir' 'relative/[name].[ext]' '/absolute/[name].[ext]'
Templates are file-loader patterns |
toType | N | 'file' if to has extension or from is file
'dir' if from is directory, to has no extension or ends in '/'
'template' if to contains a template pattern | |
context | N | options.context || compiler.options.context | A path that determines how to interpret the from path |
flatten | N | false | Removes all directory references and only copies file names
If files have the same name, the result is non-deterministic |
ignore | N | [] | Additional globs to ignore for this pattern |
transform | N | function(content, path) { return content; } | Function that modifies file contents before writing to webpack |
force | N | false | Overwrites files already in compilation.assets (usually added by other plugins) |
Available options:
Name | Default | Details |
---|
context | compiler.options.context | A path that determines how to interpret the from path, shared for all patterns |
ignore | [] | Array of globs to ignore (applied to from ) |
copyUnmodified | false | Copies files, regardless of modification when using watch or webpack-dev-server. All files are copied on first build, regardless of this option. |
debug | 'warning' | options: 'warning' - only warnings 'info' or true - file location and read info 'debug' - very detailed debugging info |
Examples
var CopyWebpackPlugin = require('copy-webpack-plugin');
var path = require('path');
module.exports = {
context: path.join(__dirname, 'app'),
devServer: {
outputPath: path.join(__dirname, 'build')
},
plugins: [
new CopyWebpackPlugin([
{ from: 'from/file.txt' },
'from/file.txt',
{ from: 'from/file.txt', to: 'to/file.txt' },
{ from: 'from/file.txt', to: 'to/directory' },
{ from: 'from/directory' },
{ from: 'from/directory', to: 'to/directory' },
{ from: 'from/directory/**/*', to: '/absolute/path' },
{
from: {
glob:'from/directory/**/*',
dot: true
},
to: '/absolute/path'
},
{
context: 'from/directory',
from: '**/*',
to: '/absolute/path'
},
{
from: 'path/to/file.txt',
to: 'file/without/extension',
toType: 'file'
},
{
from: 'path/to/file.txt',
to: 'directory/with/extension.ext',
toType: 'dir'
}
], {
ignore: [
'*.txt',
'**/*',
{ glob: '**/*', dot: false }
],
copyUnmodified: true
})
]
};
FAQ
"EMFILE: too many open files" or "ENFILE: file table overflow"
Globally patch fs with graceful-fs
npm install graceful-fs --save-dev
At the top of your webpack config, insert this
var fs = require('fs');
var gracefulFs = require('graceful-fs');
gracefulFs.gracefulify(fs);
See this issue for more details
This doesn't copy my files with webpack-dev-server
Starting in version 3.0.0, we stopped using fs to copy files to the filesystem and started depending on webpack's in-memory filesystem:
... webpack-dev-server will serve the static files in your build folder. It’ll watch your source files for changes and when changes are made the bundle will be recompiled. This modified bundle is served from memory at the relative path specified in publicPath (see API). It will not be written to your configured output directory.
If you must have webpack-dev-server write to your output directory, you can force it with the write-file-webpack-plugin.
Maintainers