123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const CopyPlugin = require("copy-webpack-plugin");
- const HtmlMinimizerPlugin = require("html-minimizer-webpack-plugin");
- const { CleanWebpackPlugin } = require("clean-webpack-plugin");
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
- const CompressionPlugin = require("compression-webpack-plugin");
- const TerserPlugin = require("terser-webpack-plugin");
- const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
- const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
- const webpack = require("webpack");
- const path = require("path");
- const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
- const globSync = require("glob").sync;
- const glob = require('glob');
- const { merge } = require('webpack-merge');
- const devserver = require('./webpack/webpack.dev.js');
- const PurgeCSSPlugin = require('purgecss-webpack-plugin')
- const whitelister = require('purgecss-whitelister');
- const GrpcToolsNodeProtocPlugin = require('./webpack/GrpcToolsNodeProtocPlugin.js');
- const buildRootPath = path.join(process.cwd(), '..', '..', '..');
- const wifiManagerPath = glob.sync(path.join(buildRootPath, 'components/**/wifi-manager*'))[0];
- const ComponentsPath = glob.sync(path.join(buildRootPath, 'components/'))[0];
- const buildCRootPath = glob.sync(buildRootPath)[0];
- const SPIFFSPath = glob.sync(path.join(buildRootPath, 'SPIFFS'))[0];
- const PATHS = {
- src: path.join(__dirname, 'src')
- }
- class BuildEventsHook {
- constructor(name, fn, stage = 'afterEmit') {
- this.name = name;
- this.stage = stage;
- this.function = fn;
- }
- apply(compiler) {
- compiler.hooks[this.stage].tap(this.name, this.function);
- }
- }
- module.exports = (env, options) => (
- merge(
- env.WEBPACK_SERVE ? devserver : {},
- env.ANALYZE_SIZE ? {
- plugins: [new BundleAnalyzerPlugin(
- {
- analyzerMode: 'static',
- generateStatsFile: true,
- statsFilename: 'stats.json',
- }
- )]
- } : {},
-
- {
- entry:
- {
- index: './src/index.ts'
- },
- devtool: "source-map",
- module: {
- rules: [
- {
- test: /\.ejs$/,
- loader: 'ejs-loader',
- options: {
- variable: 'data',
- interpolate: '\\{\\{(.+?)\\}\\}',
- evaluate: '\\[\\[(.+?)\\]\\]'
- }
- },
- {
- test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
- use: [
- {
- loader: 'file-loader',
- options: {
- name: '[name].[ext]',
- outputPath: 'fonts/'
- }
- }
- ]
- },
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {
- test: /\.(scss)$/,
- use: [
- {
- loader: MiniCssExtractPlugin.loader,
- options: {
- publicPath: "../",
- },
- },
-
-
-
-
- {
-
- loader: 'css-loader'
- },
- {
-
- loader: 'postcss-loader',
- options: {
-
-
- postcssOptions: {
-
- plugins: function () {
- return [
- require('autoprefixer')
- ];
- }
- }
- }
- }, {
-
- loader: 'sass-loader'
- }]
- },
- {
- test: /\.js$/,
- exclude: /(node_modules|bower_components)/,
- use: {
- loader: "babel-loader",
- options: {
- presets: ["@babel/preset-env"],
- plugins: ['@babel/plugin-transform-runtime']
- },
- },
- },
- {
- test: /\.(jpe?g|png|gif|svg)$/i,
- type: "asset",
- },
-
-
-
-
- {
- test: /\.html$/i,
- loader: "html-loader",
- options: {
- minimize: true,
- }
- },
- {
- test: /\.tsx?$/,
- use: 'ts-loader',
- exclude: /node_modules/,
- }
- ],
- },
- plugins: [
- new GrpcToolsNodeProtocPlugin({
- protoPaths: [`${path.join(ComponentsPath, 'spotify/cspot/bell/external/nanopb/generator/proto')}`,
- `${path.join(buildCRootPath, 'protobuf/proto')}`],
- protoSources: [`${path.join(buildCRootPath, 'protobuf/proto/*.proto')}`,
- `${path.join(ComponentsPath, 'spotify/cspot/bell/external/nanopb/generator/proto/*.proto')}`],
- outputDir: './src/js/proto'
- }
- ),
- new HtmlWebpackPlugin({
- title: 'SqueezeESP32',
- template: './src/index.ejs',
- filename: 'index.html',
- inject: 'body',
- minify: {
- html5: true,
- collapseWhitespace: true,
- minifyCSS: true,
- minifyJS: true,
- minifyURLs: false,
- removeAttributeQuotes: true,
- removeComments: true,
- removeEmptyAttributes: true,
- removeOptionalTags: true,
- removeRedundantAttributes: true,
- removeScriptTypeAttributes: true,
- removeStyleLinkTypeAttributese: true,
- useShortDoctype: true
- },
- favicon: "./src/assets/images/favicon-32x32.png",
- excludeChunks: ['test'],
- }),
-
-
-
-
-
-
-
-
-
-
- new MiniCssExtractPlugin({
- filename: "css/[name].css",
- }),
- new PurgeCSSPlugin({
- keyframes: false,
- paths: glob.sync(`${path.join(__dirname, 'src')}/**/*`, {
- nodir: true
- }),
- whitelist: whitelister('bootstrap/dist/css/bootstrap.css')
- }),
- new webpack.ProvidePlugin({
- $: "jquery",
-
-
-
-
-
- }),
- new CompressionPlugin({
-
- test: /\.js$|\.css$|\.html$/,
- filename: "[path][base].gz",
- algorithm: 'gzip',
- threshold: 100,
- minRatio: 0.8,
- }),
- ],
- optimization: {
- minimize: true,
- providedExports: true,
- usedExports: true,
- minimizer: [
- new TerserPlugin({
- terserOptions: {
- format: {
- comments: false,
- },
- },
- extractComments: false,
-
- parallel: true,
- }),
- new HtmlMinimizerPlugin({
- minimizerOptions: {
- removeComments: true,
- removeOptionalTags: true,
- }
- }
- ),
- new CssMinimizerPlugin(),
- new ImageMinimizerPlugin({
- minimizer: {
- implementation: ImageMinimizerPlugin.imageminMinify,
- options: {
-
-
- plugins: [
- ["gifsicle", { interlaced: true }],
- ["jpegtran", { progressive: true }],
- ["optipng", { optimizationLevel: 5 }],
-
- [
- "svgo",
- {
- plugins: [
- {
- name: 'preset-default',
- params: {
- overrides: {
-
- inlineStyles: {
- onlyMatchedOnce: false,
- },
-
- removeDoctype: false,
- },
- },
- }
- ],
- },
- ],
- ],
- },
- },
- }),
- ],
- splitChunks: {
- cacheGroups: {
- vendor: {
- name: "node_vendors",
- test: /[\\/]node_modules[\\/]/,
- chunks: "all",
- }
- }
- }
- },
-
-
-
-
-
- resolve: {
- extensions: ['.tsx', '.ts', '.js', '.ejs'],
- },
- output: {
- path: path.resolve(__dirname, 'dist'),
-
- filename: './js/[name].bundle.js',
- clean: true
- },
- }
- )
- );
|