@mamba/webpack
Version:
Webpack configs for Mamba Applications
174 lines (171 loc) • 4.56 kB
JavaScript
/**
* Common webpack configuration
*/
const MiniHtmlWebpackPlugin = require('mini-html-webpack-plugin');
const WebpackBar = require('webpackbar');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack');
const { fromCwd } = require('quickenv');
const getHTMLTemplate = require('./helpers/getHTMLTemplate.js');
const loaders = require('./helpers/loaders.js');
const {
isOfModuleType,
transpileIgnoreBaseCondition,
} = require('./helpers/depTranspiling.js');
const {
DEBUG_LVL,
IS_POS,
IS_BROWSER,
IS_DEV,
IS_PROD,
NODE_ENV,
APP_ENV,
ADD_MAMBA_SIMULATOR,
} = require('./helpers/consts.js');
module.exports = {
mode: IS_PROD ? 'production' : 'development',
cache: true,
target: 'web',
node: false,
context: fromCwd('src'),
output: {
path: fromCwd('dist'),
publicPath: './',
filename: '[name].[hash:5].js',
chunkFilename: '[name].[hash:5].js',
},
resolve: {
/** Do not resolve symlinks */
symlinks: false,
enforceExtension: false,
mainFields: ['svelte', 'esnext', 'jsnext:main', 'module', 'main'],
extensions: ['.js', '.json', '.pcss', '.css', '.html', '.htmlx', '.svelte'],
},
module: {
rules: [
/**
* ! App modules
* */
{
test: /\.(htmlx?|svelte)$/,
include: [fromCwd('src')],
exclude: [/node_modules/],
use: [loaders.babelEsNext, loaders.svelte, loaders.eslint],
},
{
test: /\.js$/,
include: [fromCwd('src')],
exclude: [/node_modules/],
use: [loaders.babelEsNext, loaders.eslint],
},
/**
* ! Dependency modules
* */
/** On dependencies svelte files, run svelte compiler and babel */
{
test: /\.(htmlx?|svelte)$/,
include: [/node_modules/],
/** When developing, parse linked packages svelte dependencies */
use: [loaders.babelEsNext, loaders.svelte],
},
/** Transpile .mjs dependencies as well */
{
test: /\.mjs$/,
include: [/node_modules/],
exclude: [/core-js/],
use: [loaders.babelEsNext],
},
/**
* * Run app COMMONJS dependencies through babel with module: 'commonjs'.
* @babel/preset-env inserts es6 import if we don't pass "module: 'commonjs'",
* resulting in mixed es6 and commonjs code.
* */
{
test: {
...transpileIgnoreBaseCondition,
and: [isOfModuleType('cjs')],
},
use: [loaders.babelCJS],
},
/** Run app ES6 dependencies through babel with { modules: false } */
{
test: {
...transpileIgnoreBaseCondition,
and: [isOfModuleType('es')],
},
use: [loaders.babelEsNext],
},
/**
* ! Generic files
*/
{
test: /\.(css|pcss)$/,
/** When importing from a style file, let's
* use package.json's 'style' field before
* the actual 'main' one
* */
resolve: { mainFields: ['style', 'main'] },
use: [
loaders.extractCss,
loaders.css,
loaders.postcss,
loaders.resolveUrl,
],
},
],
},
plugins: [
new WebpackBar(),
new MiniCssExtractPlugin({
filename: 'style.css',
chunkFilename: '[name].[hash:5].css',
}),
new MiniHtmlWebpackPlugin({
context: { title: 'Application' },
template: getHTMLTemplate,
}),
new webpack.DefinePlugin({
__NODE_ENV__: JSON.stringify(NODE_ENV),
__APP_ENV__: JSON.stringify(APP_ENV),
__PROD__: IS_PROD,
__TEST__: NODE_ENV === 'test',
__DEV__: IS_DEV,
__DEBUG_LVL__: DEBUG_LVL,
__POS__: IS_POS,
__SIMULATOR__: ADD_MAMBA_SIMULATOR,
__BROWSER__: IS_BROWSER,
}),
],
/** Minimal useful output log */
stats: {
modules: false,
chunks: false,
colors: true,
children: false,
},
optimization: {
namedChunks: true,
namedModules: true,
/** Create a separate chunk for webpack runtime */
runtimeChunk: { name: 'runtime' },
splitChunks: {
chunks: 'all',
minSize: 0,
minChunks: 1,
automaticNameDelimiter: '_',
cacheGroups: {
vendors: false,
libs: {
test: /[\\/]node_modules[\\/]/,
priority: -10,
},
/** Chunk that contains used polyfills */
polyfills: {
test: /core-js/,
name: 'polyfills',
priority: 10,
},
},
},
},
};