Upgrade to Webpack 4

This commit is contained in:
Tim Schaub
2018-01-25 09:47:01 -07:00
committed by ahocevar
parent 79a5bd6538
commit 48cbca1f6e
4 changed files with 23 additions and 69 deletions

View File

@@ -1,10 +1,7 @@
const MinifyPlugin = require('babel-minify-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin'); const CopyPlugin = require('copy-webpack-plugin');
const ExampleBuilder = require('./example-builder'); const ExampleBuilder = require('./example-builder');
const fs = require('fs'); const fs = require('fs');
const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpack = require('webpack');
const src = path.join(__dirname, '..'); const src = path.join(__dirname, '..');
@@ -17,15 +14,17 @@ examples.forEach(example => {
entry[example] = `./${example}.js`; entry[example] = `./${example}.js`;
}); });
const main = { module.exports = {
context: src, context: src,
target: 'web', target: 'web',
entry: entry, entry: entry,
plugins: [ optimization: {
new webpack.optimize.CommonsChunkPlugin({ splitChunks: {
name: 'common', name: 'common', // TODO: figure out why this isn't working
minChunks: 2 minChunks: 2
}), }
},
plugins: [
new ExampleBuilder({ new ExampleBuilder({
templates: path.join(__dirname, '..', 'templates'), templates: path.join(__dirname, '..', 'templates'),
common: 'common' common: 'common'
@@ -38,45 +37,10 @@ const main = {
{from: 'index.html', to: 'index.html'} {from: 'index.html', to: 'index.html'}
]) ])
], ],
// TODO: figure out why this hangs
// devtool: 'source-map',
output: { output: {
filename: '[name].js', filename: '[name].js',
path: path.join(__dirname, '..', '..', 'build', 'examples') path: path.join(__dirname, '..', '..', 'build', 'examples')
} }
}; };
// configuration specific to the dev environment
const dev = {
devtool: 'source-map',
plugins: [
new webpack.EnvironmentPlugin(
Object.assign({NODE_ENV: 'development'}, process.env)
)
]
};
// configuration specific to the prod environment
const prod = {
plugins: [
new webpack.EnvironmentPlugin(
Object.assign({NODE_ENV: 'production'}, process.env)
),
new MinifyPlugin()
]
};
module.exports = env => {
let config;
switch (env) {
case 'prod': {
config = merge(main, prod);
break;
}
default: {
config = merge(main, dev);
}
}
return config;
};

View File

@@ -5,6 +5,7 @@ const marked = require('marked');
const path = require('path'); const path = require('path');
const pkg = require('../../package.json'); const pkg = require('../../package.json');
const promisify = require('util').promisify; const promisify = require('util').promisify;
const RawSource = require('webpack-sources').RawSource;
const readFile = promisify(fs.readFile); const readFile = promisify(fs.readFile);
const isCssRegEx = /\.css$/; const isCssRegEx = /\.css$/;
@@ -77,7 +78,7 @@ function ExampleBuilder(config) {
* @param {Object} compiler The webpack compiler. * @param {Object} compiler The webpack compiler.
*/ */
ExampleBuilder.prototype.apply = function(compiler) { ExampleBuilder.prototype.apply = function(compiler) {
compiler.plugin('emit', async (compilation, callback) => { compiler.hooks.emit.tapPromise('ExampleBuilder', async (compilation) => {
const chunks = compilation.getStats().toJson().chunks const chunks = compilation.getStats().toJson().chunks
.filter(chunk => chunk.names[0] !== this.common); .filter(chunk => chunk.names[0] !== this.common);
@@ -94,19 +95,11 @@ ExampleBuilder.prototype.apply = function(compiler) {
}); });
for (const file in assets) { for (const file in assets) {
compilation.assets[file] = { compilation.assets[file] = new RawSource(assets[file]);
source: () => assets[file],
size: () => assets[file].length
};
} }
}); });
try { await Promise.all(promises);
await Promise.all(promises);
} catch (err) {
callback(err);
return;
}
const info = { const info = {
examples: exampleData, examples: exampleData,
@@ -114,12 +107,7 @@ ExampleBuilder.prototype.apply = function(compiler) {
}; };
const indexSource = `var info = ${JSON.stringify(info)}`; const indexSource = `var info = ${JSON.stringify(info)}`;
compilation.assets['index.js'] = { compilation.assets['index.js'] = new RawSource(indexSource);
source: () => indexSource,
size: () => indexSource.length
};
callback();
}); });
}; };

View File

@@ -14,8 +14,8 @@
"posttest": "npm run typecheck", "posttest": "npm run typecheck",
"test": "npm run karma -- --single-run", "test": "npm run karma -- --single-run",
"karma": "karma start test/karma.config.js", "karma": "karma start test/karma.config.js",
"serve-examples": "mkdir -p build/examples && webpack --config examples/webpack/config.js --watch & serve build/examples", "serve-examples": "mkdir -p build/examples && webpack --config examples/webpack/config.js --mode development --watch & serve build/examples",
"build-examples": "webpack --config examples/webpack/config.js --env=prod", "build-examples": "webpack --config examples/webpack/config.js --mode production",
"build-index": "node tasks/generate-index", "build-index": "node tasks/generate-index",
"prebuild": "npm run build-index", "prebuild": "npm run build-index",
"build": "rollup --config config/rollup.js", "build": "rollup --config config/rollup.js",
@@ -47,9 +47,8 @@
"babel-core": "^6.26.3", "babel-core": "^6.26.3",
"babel-minify-webpack-plugin": "^0.3.0", "babel-minify-webpack-plugin": "^0.3.0",
"babel-plugin-jsdoc-closure": "1.5.1", "babel-plugin-jsdoc-closure": "1.5.1",
"chaikin-smooth": "1.0.4",
"clean-css-cli": "4.1.11", "clean-css-cli": "4.1.11",
"copy-webpack-plugin": "^4.0.1", "copy-webpack-plugin": "^4.4.1",
"coveralls": "3.0.1", "coveralls": "3.0.1",
"eslint": "4.19.1", "eslint": "4.19.1",
"eslint-config-openlayers": "^9.2.0", "eslint-config-openlayers": "^9.2.0",
@@ -59,7 +58,6 @@
"glob": "^7.1.2", "glob": "^7.1.2",
"google-closure-compiler": "20180506.0.0", "google-closure-compiler": "20180506.0.0",
"handlebars": "4.0.11", "handlebars": "4.0.11",
"html-webpack-plugin": "^3.0.1",
"istanbul": "0.4.5", "istanbul": "0.4.5",
"jquery": "3.3.1", "jquery": "3.3.1",
"jsdoc": "3.5.5", "jsdoc": "3.5.5",
@@ -86,8 +84,9 @@
"sinon": "^5.0.1", "sinon": "^5.0.1",
"url-polyfill": "^1.0.13", "url-polyfill": "^1.0.13",
"walk": "^2.3.9", "walk": "^2.3.9",
"webpack": "3.11.0", "webpack": "^4.0.0",
"webpack-merge": "4.1.2" "webpack-cli": "^2.0.9",
"webpack-sources": "^1.1.0"
}, },
"eslintConfig": { "eslintConfig": {
"extends": "openlayers" "extends": "openlayers"

View File

@@ -56,6 +56,9 @@ module.exports = function(karma) {
reporters: ['progress'], reporters: ['progress'],
webpackMiddleware: { webpackMiddleware: {
noInfo: true noInfo: true
},
webpack: {
mode: 'development'
} }
}); });