-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
133 lines (121 loc) · 3.72 KB
/
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');
const { createLoader } = require('simple-functional-loader');
const name = 'css-module-poc';
//======
// brand
//======
const BRANDS = ['cocacola', 'pepsi'];
let brand = process.env.ENTRY_POINT;
if (brand === undefined || !BRANDS.includes(brand)) {
brand = BRANDS[0]; // eslint-disable-line prefer-destructuring
}
console.log(`Brand "${brand}" used`); // eslint-disable-line no-console
const otherBrands = BRANDS.filter((t) => t !== brand);
const otherBrandsCond = otherBrands.map((b) => new RegExp(`brand=${b}`));
//======
//======
// CSS Loaders
//======
const vueStyleLoader = {
loader: 'vue-style-loader',
options: {
sourceMap: true,
},
};
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: true,
},
};
const cssLoaderModule = {
loader: 'css-loader',
options: {
modules: {
mode: 'local',
localIdentName: '[name]_[local]_[hash:base64]',
},
},
};
const sassLoader = {
loader: 'sass-loader',
options: {
sourceMap: true,
implementation: require('sass'),
},
};
const postCssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: true,
postcssOptions: {
plugins: () => ['postcss-preset-env', require('cssnano')()],
},
},
};
const nullLoader = {
loader: 'null-loader',
};
//======
module.exports = {
entry: './index.js',
mode: 'development',
devtool: 'eval-source-map',
context: path.resolve(__dirname),
plugins: [new VueLoaderPlugin(), new HtmlWebpackPlugin()],
resolve: {
symlinks: true,
extensions: ['.js', '.vue'],
},
module: {
rules: [
{
test: /\.(css|scss)$/,
oneOf: [
// this matches `<style brand=TheOtherBrand>`
{
resourceQuery: otherBrandsCond,
use: nullLoader,
},
// this matches `<style module>`
{
resourceQuery: /module/,
use: [vueStyleLoader, cssLoaderModule, postCssLoader, sassLoader],
},
// this matches plain `<style>` or `<style scoped>`
{
use: [vueStyleLoader, cssLoader, postCssLoader, sassLoader],
},
],
},
{
test: /\.vue$/,
loader: 'vue-loader',
},
/*
Workaround single module style by deleting the entire
style tags and contents that matches the other brand
uncomment to see module "work" but for two styles with modules in a single file only,
where both contain different brands to be filtered out. Doesn't work with two of the same
*/
// {
// test: /\.vue$/,
// use: createLoader(function(source, map) {
// const brandStyleRemoval = new RegExp(`(<style)(.*)(brand=("|')?${otherBrands[0]}("|')?)(.*?)>(.|\n)*?(<\/style>)`, 'gmi');
// const sourceUnbranded = source?.replace(brandStyleRemoval, '');
// return sourceUnbranded ?? source
// }),
// },
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: require('./.babelrc'),
},
exclude: (file) => /node_modules/.test(file),
},
],
},
};