Skip to content

Commit a12f239

Browse files
authored
fix(tooling): replace Rollup with Webpack for bundling of meetings widget (webex#617)
1 parent fab0381 commit a12f239

4 files changed

Lines changed: 694 additions & 785 deletions

File tree

packages/@webex/widgets/package.json

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
"engines": {
55
"node": ">=20.13.1"
66
},
7-
"main": "dist/webexWidgets.esm.js",
8-
"module": "dist/webexWidgets.esm.js",
7+
"main": "dist/webexWidgets.mjs",
8+
"module": "dist/webexWidgets.mjs",
99
"scripts": {
1010
"clean": "rm -rf dist && rm -rf node_modules",
1111
"clean:dist": "rm -rf dist",
12-
"build:src": "yarn clean:dist && rollup -c",
13-
"demo:serve": "webpack serve ./demo/App.jsx --mode development",
14-
"demo:build": "webpack ./demo/App.jsx --mode production",
12+
"build:src": "yarn clean:dist && webpack ./src/index.js --env buildType=dist --mode production",
13+
"demo:serve": "webpack serve ./demo/App.jsx --env buildType=demo --mode development",
14+
"demo:build": "webpack ./demo/App.jsx --env buildType=demo --mode development",
1515
"deploy:npm": "yarn npm publish",
1616
"release": "semantic-release",
1717
"release:debug": "semantic-release --debug",
@@ -55,11 +55,6 @@
5555
"@commitlint/cli": "^8.3.5",
5656
"@commitlint/config-conventional": "^8.3.4",
5757
"@momentum-ui/react": "^23.21.4",
58-
"@rollup/plugin-babel": "^5.3.0",
59-
"@rollup/plugin-commonjs": "^21.0.1",
60-
"@rollup/plugin-json": "^4.1.0",
61-
"@rollup/plugin-node-resolve": "^13.0.6",
62-
"@rollup/plugin-replace": "^3.0.0",
6358
"@semantic-release/changelog": "^6.0.0",
6459
"@semantic-release/git": "^10.0.0",
6560
"@wdio/cli": "^7.3.1",
@@ -77,6 +72,7 @@
7772
"clean-webpack-plugin": "^3.0.0",
7873
"crypto-browserify": "^3.12.0",
7974
"css-loader": "^3.4.2",
75+
"css-minimizer-webpack-plugin": "^7.0.4",
8076
"dotenv": "^8.6.0",
8177
"eslint": "^6.8.0",
8278
"eslint-config-airbnb": "^18.0.1",
@@ -94,16 +90,13 @@
9490
"html-loader": "^0.5.5",
9591
"html-webpack-plugin": "^5.6.0",
9692
"husky": "^4.2.3",
93+
"mini-css-extract-plugin": "^2.10.0",
9794
"os-browserify": "^0.3.0",
98-
"postcss": "^8.2.13",
99-
"postcss-url": "^10.1.3",
10095
"prettier": "^1.19.1",
10196
"prop-types": "^15.7.2",
10297
"querystring-es3": "^0.2.1",
10398
"react": "18.3.1",
10499
"react-dom": "18.3.1",
105-
"rollup": "^2.59.0",
106-
"rollup-plugin-postcss": "^4.0.0",
107100
"sass": "^1.83.1",
108101
"sass-loader": "^10.5.2",
109102
"semantic-release": "^18.0.0",

packages/@webex/widgets/rollup.config.js

Lines changed: 0 additions & 66 deletions
This file was deleted.

packages/@webex/widgets/webpack.config.js

Lines changed: 85 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,64 @@ const path = require('path');
22
const webpack = require('webpack');
33
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
44
const HtmlWebpackPlugin = require('html-webpack-plugin');
5+
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
6+
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
57
const {version} = require('./package.json');
8+
const merge = require('webpack-merge').merge;
9+
10+
const baseConfigOriginal = require('../../../webpack.config');
11+
12+
const resolveMonorepoRoot = (...segments) => path.resolve(__dirname, '../../../', ...segments);
13+
14+
const {entry, ...baseConfig} = baseConfigOriginal;
15+
16+
const outputConfig = {
17+
dist: {
18+
path: path.resolve(__dirname, './dist'),
19+
filename: 'webexWidgets.mjs',
20+
library: {
21+
type: 'module',
22+
},
23+
},
24+
demo: {
25+
path: path.resolve(__dirname, './docs'),
26+
filename: 'demo.bundle.[contenthash].js',
27+
},
28+
};
629

730
module.exports = function(env, argv) {
8-
return {
31+
const buildType = env.buildType;
32+
const mode = argv.mode;
33+
const isDemo = buildType === 'demo';
34+
const isDist = buildType === 'dist';
35+
36+
const entryPoint = env.entry;
37+
38+
return merge(baseConfig, {
939
cache: true,
10-
output:
11-
argv.mode === 'production'
12-
? {
13-
path: path.resolve(__dirname, './docs'),
14-
filename: 'demo.bundle.[hash].js',
15-
}
16-
: undefined, // Otherwise the CleanWebpackPlugin will wipe our build during devserver
17-
devtool: argv.mode === 'production' ? 'source-map' : 'inline-source-map',
18-
resolve: {
19-
extensions: ['.js', '.jsx'],
20-
fallback: {
21-
"buffer": require.resolve("buffer/"),
22-
"crypto": require.resolve("crypto-browserify"),
23-
"os": require.resolve("os-browserify/browser"),
24-
"stream": require.resolve("stream-browserify"),
25-
"util": require.resolve("util/"),
26-
"url": require.resolve("url/"),
27-
"vm": require.resolve("vm-browserify"),
28-
"querystring": require.resolve('querystring-es3'),
29-
"fs": false
30-
} /*
31-
* In order to include polyfills for node.js core modules, we need to add a fallback
32-
* for the relevant packages as webpack 5 doesn't include them by default
33-
*/
34-
},
40+
entry: entryPoint,
41+
output: outputConfig[buildType],
42+
43+
// Enable ESM output
44+
experiments: isDist
45+
? {
46+
outputModule: true,
47+
}
48+
: {},
49+
50+
devtool: mode === 'production' ? 'source-map' : 'inline-source-map',
51+
52+
externals: isDemo ? {} : ['prop-types', 'react', 'react-dom', 'webex', '@webex/common'],
53+
54+
// // CSS minimization for dist builds
55+
optimization: isDist
56+
? {
57+
minimizer: [
58+
`...`, // Keep default JS minimizer
59+
new CssMinimizerPlugin(),
60+
],
61+
}
62+
: {},
3563
module: {
3664
rules: [
3765
{
@@ -41,6 +69,20 @@ module.exports = function(env, argv) {
4169
loader: 'babel-loader',
4270
},
4371
},
72+
{
73+
test: /\.css$/,
74+
use: [isDemo ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader'],
75+
include: [
76+
resolveMonorepoRoot('node_modules/@momentum-ui'),
77+
resolveMonorepoRoot('node_modules/@webex/components'),
78+
path.resolve(__dirname, 'packages'),
79+
],
80+
},
81+
{
82+
test: /\.scss$/,
83+
use: [isDemo ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
84+
include: [path.resolve(__dirname, 'packages')],
85+
},
4486
{
4587
test: /\.html$/,
4688
use: [
@@ -49,22 +91,14 @@ module.exports = function(env, argv) {
4991
},
5092
],
5193
},
52-
{
53-
test: /\.css$/,
54-
use: ['style-loader', 'css-loader'],
55-
},
56-
{
57-
test: /\.scss$/,
58-
exclude: /node_modules/,
59-
use: ['style-loader', 'css-loader', 'sass-loader'],
60-
},
6194
{
6295
test: /\.(woff(2)?|ttf|eot|svg|png|gif)(\?v=\d+\.\d+\.\d+)?$/,
6396
use: [
6497
{
6598
loader: 'file-loader',
6699
options: {
67-
outputPath: 'assets/',
100+
outputPath: isDemo ? 'assets/' : 'css/assets/',
101+
name: '[name].[contenthash].[ext]',
68102
},
69103
},
70104
],
@@ -86,23 +120,27 @@ module.exports = function(env, argv) {
86120
server: {
87121
type: 'https',
88122
},
89-
} // After upgrading webpack dev server to the latest version, config required changes as existing options were deprecated
123+
}
90124
: undefined,
91125
plugins: [
92126
new CleanWebpackPlugin(),
93-
new HtmlWebpackPlugin({
94-
filename: 'index.html',
95-
template: 'demo/index.html',
96-
favicon: 'demo/webex-logo.png',
97-
}),
98-
new webpack.HotModuleReplacementPlugin(),
127+
isDemo &&
128+
new HtmlWebpackPlugin({
129+
filename: 'index.html',
130+
template: 'demo/index.html',
131+
favicon: 'demo/webex-logo.png',
132+
}),
133+
isDemo && new webpack.HotModuleReplacementPlugin(),
134+
!isDemo &&
135+
new MiniCssExtractPlugin({
136+
filename: 'css/webex-widgets.css',
137+
}),
99138
new webpack.DefinePlugin({
100-
__appVersion__: JSON.stringify(version)
139+
__appVersion__: JSON.stringify(version),
101140
}),
102-
new webpack.ProvidePlugin({ //Fixes 'process is not defined' and 'Buffer not defined' errors
103-
process: 'process/browser',
141+
new webpack.ProvidePlugin({
104142
Buffer: ['buffer', 'Buffer'],
105143
}),
106144
],
107-
};
145+
});
108146
};

0 commit comments

Comments
 (0)