This is a webpack plugin that copies individual files or entire directories to the build directory.
Install the plugin:
npm install --save-dev copy-webpack-plugin
new CopyWebpackPlugin([patterns], options)
A pattern looks like:
{ from: 'source', to: 'dest' }
from- is required
- can be an absolute or path relative to the context
- can be a file or directory
- can be a glob
to- is optional
- if not absolute, it's relative to the build root
- must be a directory if
fromis a directory
toType- is optional
- is ignored if
fromis a directory - defaults to
'file'iftohas an extension - defaults to
'dir'iftodoesn't have an extension
force- is optional
- defaults to
false - forces the plugin to overwrite files staged by previous plugins
context- is optional
- defaults to the base context
- is a pattern specific context
flatten- is optional
- defaults to
false - removes all directory references and only copies file names
- if files have the same name, the result is non-deterministic
ignore- additional globs to ignore for this pattern
ignore- an array of files and directories to ignore
- accepts globs
- globs are evaluated on the
frompath, relative to the context
copyUnmodified- is optional
- defaults to
false(only copies modified files) truecopies all files while using watch or webpack-dev-server
var CopyWebpackPlugin = require('copy-webpack-plugin');
var path = require('path');
module.exports = {
context: path.join(__dirname, 'app'),
devServer: {
// This is required for webpack-dev-server if using a version <3.0.0.
// The path should be an absolute path to your build destination.
outputPath: path.join(__dirname, 'build')
},
plugins: [
new CopyWebpackPlugin([
// {output}/file.txt
{ from: 'from/file.txt' },
// {output}/to/file.txt
{ from: 'from/file.txt', to: 'to/file.txt' },
// {output}/to/directory/file.txt
{ from: 'from/file.txt', to: 'to/directory' },
// Copy directory contents to {output}/
{ from: 'from/directory' },
// Copy directory contents to {output}/to/directory/
{ from: 'from/directory', to: 'to/directory' },
// Copy glob results to /absolute/path/
{ from: 'from/directory/**/*', to: '/absolute/path' },
// Copy glob results (with dot files) to /absolute/path/
{
from: {
glob:'from/directory/**/*',
dot: true
},
to: '/absolute/path'
},
// Copy glob results, relative to context
{
context: 'from/directory',
from: '**/*',
to: '/absolute/path'
},
// {output}/file/without/extension
{
from: 'path/to/file.txt',
to: 'file/without/extension',
toType: 'file'
},
// {output}/directory/with/extension.ext/file.txt
{
from: 'path/to/file.txt',
to: 'directory/with/extension.ext',
toType: 'dir'
}
], {
ignore: [
// Doesn't copy any files with a txt extension
'*.txt',
// Doesn't copy any file, even if they start with a dot
{ glob: '**/*', dot: true }
],
// By default, we only copy modified files during
// a watch or webpack-dev-server build. Setting this
// to `true` copies all files.
copyUnmodified: true
})
]
};Run npm test
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
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.
MIT