123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- /* eslint-disable */
- // Merges webpack.common config with this production config
- const merge = require('webpack-merge');
- const common = require('./webpack.common.js');
- const webpack = require('webpack');
- const CleanWebpackPlugin = require('clean-webpack-plugin');
- // Optimisations and Compression
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
- const TerserPlugin = require('terser-webpack-plugin');
- const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
- const CompressionPlugin = require('compression-webpack-plugin');
- const fs = require('fs');
- const glob = require('glob');
- var WebpackOnBuildPlugin = require('on-build-webpack');
- const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
- const path = require('path')
- const ExtractTextPlugin = require('extract-text-webpack-plugin')
- const PurgecssPlugin = require('purgecss-webpack-plugin')
- // Optional
- const FaviconsWebpackPlugin = require('favicons-webpack-plugin');
- const PATHS = {
- src: path.join(__dirname, 'src')
- }
- module.exports = merge(common, {
- mode: 'production',
- stats: 'errors-only',
- optimization: {
- minimizer: [
- new TerserPlugin({
- test: /\.js(\?.*)?$/i,
- exclude: /node_modules/,
- cache: true,
- parallel: 4,
- sourceMap: true,
- }),
- new OptimizeCSSAssetsPlugin({})
- ],
- runtimeChunk: 'single',
- splitChunks: {
- chunks: 'all',
- // maxInitialRequests: Infinity,
- // minSize: 0,
- cacheGroups: {
- vendor: {
- test: /node_modules/, // you may add "vendor.js" here if you want to
- name: "node-modules",
- chunks: "initial",
- enforce: true
- },
- }
- },
- },
- plugins: [
- new MiniCssExtractPlugin({
- filename: 'css/[name].[hash:6].css',
- chunkFilename: 'css/[name].[contenthash].css',
- }),
- new ExtractTextPlugin('[name].css?[hash]'),
- new PurgecssPlugin({
- paths: glob.sync(`${PATHS.src}/*`),
- whitelist: ['whitelisted']
- }),
- new CleanWebpackPlugin(),
- new CompressionPlugin({
- test: /\.(js|css|html|svg)$/,
- filename: '[path].br[query]',
- algorithm: 'brotliCompress',
- compressionOptions: { level: 11 },
- threshold: 100,
- minRatio: 0.8,
- deleteOriginalAssets: false
- }),
- new CompressionPlugin({
- filename: '[path].gz[query]',
- algorithm: 'gzip',
- test: /\.js$|\.css$|\.html$/,
- threshold: 100,
- minRatio: 0.8,
- }),
- // new FaviconsWebpackPlugin({
- // // Your source logo
- // logo: './src/assets/images/200px-ControllerAppIcon.png',
- // // // The prefix for all image files (might be a folder or a name)
- // //prefix: 'assets/icons_[hash:6]/',
- // prefix: 'icons_[hash:6]/',
- // // // Emit all stats of the generated icons
- // //emitStats: false,
- // // // The name of the json containing all favicon information
- // // statsFilename: 'iconstats-[hash].json',
- // // // Generate a cache file with control hashes and
- // // // don't rebuild the favicons until those hashes change
- // persistentCache: true,
- // // // Inject the html into the html-webpack-plugin
- // inject: true,
- // // // favicon background color (see https://github.com/haydenbleasel/favicons#usage)
- // background: '#fff',
- // // // which icons should be generated (see https://github.com/haydenbleasel/favicons#usage)
- // icons: {
- // // android: false,
- // // appleIcon: false,
- // favicons: true
- // // firefox: true,
- // // windows: false
- // }
- // }),
- new WebpackOnBuildPlugin(function(stats) {
- var getDirectories = function (src, callback) {
- glob(`${src}/**/*(*.gz|favicon-32x32.png)`, callback);
- };
- console.log('Cleaning up previous builds');
- glob(`../../../build/*.S`, function (err, list) {
- if (err) {
- console.error('Error', err);
- } else {
- list.forEach(fileName=>{
- try {
- console.log(`Purging old binary file ${fileName} from C project.`);
- fs.unlinkSync(fileName)
- //file removed
- } catch(ferr) {
- console.error(ferr)
- }
- });
- }
- }
- );
- console.log('Generating C include files from webpack build output');
- getDirectories('./webpack/dist', function (err, list) {
- if (err) {
- console.log('Error', err);
- } else {
- const regex = /^(.*\/)([^\/]*)$/
- const relativeRegex = /((\w+(?<!dist)\/){0,1}[^\/]*)$/
- const makePathRegex = /([^\.].*)$/
- let exportDefHead=
- '/***********************************\n'+
- 'webpack_headers\n'+
- stats+'\n'+
- '***********************************/\n'+
- '#pragma once\n'+
- '#include <inttypes.h>\n'+
- 'extern const char * resource_lookups[];\n'+
- 'extern const uint8_t * resource_map_start[];\n'+
- 'extern const uint8_t * resource_map_end[];\n';
- let exportDef= '// Automatically generated. Do not edit manually!.\n'+
- '#include <inttypes.h>\n';
- let lookupDef='const char * resource_lookups[] = {\n';
- let lookupMapStart='const uint8_t * resource_map_start[] = {\n';
- let lookupMapEnd='const uint8_t * resource_map_end[] = {\n';
- let cMake='';
- list.forEach(fileName=>{
- let exportName=fileName.match(regex)[2].replace(/[\. \-]/gm,'_');
- let relativeName=fileName.match(relativeRegex)[1];
- exportDef+= 'extern const uint8_t _'+exportName+'_start[] asm("_binary_'+exportName+'_start");\n'+
- 'extern const uint8_t _'+exportName+'_end[] asm("_binary_'+exportName+'_end");\n';
- lookupDef+='\t"/'+relativeName+'",\n';
- lookupMapStart+='\t_'+ exportName+'_start,\n';
- lookupMapEnd+= '\t_'+ exportName+'_end,\n';
- cMake+='target_add_binary_data( __idf_wifi-manager ./webapp'+fileName.match(makePathRegex)[1]+' BINARY)\n';
- });
- lookupDef+='""\n};\n';
- lookupMapStart=lookupMapStart.substring(0,lookupMapStart.length-2)+'\n};\n';
- lookupMapEnd=lookupMapEnd.substring(0,lookupMapEnd.length-2)+'\n};\n';
- try {
- fs.writeFileSync('webapp.cmake', cMake);
- fs.writeFileSync('webpack.c', exportDef+lookupDef+lookupMapStart+lookupMapEnd);
- fs.writeFileSync('webpack.h', exportDefHead);
- //file written successfully
- } catch (e) {
- console.error(e);
- }
- }
- });
- console.log('Post build completed.');
- }),
- new BundleAnalyzerPlugin()
- ]
- });
|