JamVueSSRPOC/webpack/environment.config.js
Matthew Gaffen 4b77d0b8ca first commit
2019-08-14 19:09:08 +01:00

89 lines
2.7 KiB
JavaScript

const OptimizeJsPlugin = require("optimize-js-plugin");
const resolvers = require("./resolvers.js");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const WebpackAssetsManifest = require("webpack-assets-manifest");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const url = require("url");
// Vue config Stuff
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const path = require("path");
const webpack = require("webpack");
const assetsPath = path.resolve(__dirname, "..", "public", "assets");
function isProduction(env) {
return env === "production";
}
function getPlugins(env) {
let plugins = [new webpack.ProgressPlugin({ profile: false })];
return [
new webpack.IgnorePlugin(/\.\/dev/, /\/config$/),
new CleanWebpackPlugin(),
new OptimizeJsPlugin({
sourceMap: !isProduction(env)
}),
new webpack.optimize.OccurrenceOrderPlugin(),
new MiniCssExtractPlugin({
filename: env == "development" ? "[name].css" : "[name]-[chunkhash].css",
chunkFilename: "[id].css"
}),
// Map output assets to eleventy data
new WebpackAssetsManifest({
output: "../../data/manifest.json",
transform: (assets, manifest) => {
// Object to contain final asset map
let output = {};
// Create dedicated asset map for vue components
let vueComponents = {};
Object.keys(manifest.compiler.records).forEach(e => {
if (e.includes(".vue?")) {
// Add vue component to object with component name as key
const compName = e
.match(/\/(.*)\.vue/)[1]
.split("/")
.pop();
vueComponents[compName] = url.parse(e.split(" ")[1], true).query.id;
}
});
// Add vue components to the 'vue' key of the asset manifest
output.vue = vueComponents;
Object.keys(assets).forEach(assetName => {
const batchName = assetName.replace(/\.[^/.]+$/, ""),
outputName = assets[assetName];
if (typeof output[batchName] == "undefined") {
output[batchName] = {};
}
if (outputName.endsWith(".js")) {
output[batchName].js = outputName;
} else if (outputName.endsWith(".css")) {
output[batchName].css = outputName;
}
});
return output;
}
}),
new VueLoaderPlugin()
];
}
module.exports = (config, env, target) => {
if (!isProduction(env)) {
config.devtool = "cheap-module-eval-source-map";
}
config.resolve = resolvers;
config.plugins = getPlugins(env);
config.externals = {
window: "window"
};
config.optimization = { minimize: isProduction(env) };
return config;
};