274 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
| const { getProjectPath, resolve } = require('./utils/projectHelper');
 | |
| const path = require('path');
 | |
| const webpack = require('webpack');
 | |
| const WebpackBar = require('webpackbar');
 | |
| const { merge } = require('webpack-merge');
 | |
| const TerserPlugin = require('terser-webpack-plugin');
 | |
| const MiniCssExtractPlugin = require('mini-css-extract-plugin');
 | |
| const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
 | |
| const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
 | |
| const CleanUpStatsPlugin = require('./utils/CleanUpStatsPlugin');
 | |
| // const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
 | |
| 
 | |
| const distFileBaseName = 'antd';
 | |
| 
 | |
| const svgRegex = /\.svg(\?v=\d+\.\d+\.\d+)?$/;
 | |
| const svgOptions = {
 | |
|   limit: 10000,
 | |
|   minetype: 'image/svg+xml',
 | |
| };
 | |
| 
 | |
| const imageOptions = {
 | |
|   limit: 10000,
 | |
| };
 | |
| 
 | |
| function getWebpackConfig(modules, esm = false) {
 | |
|   const pkg = require(getProjectPath('package.json'));
 | |
|   const babelConfig = require('./getBabelCommonConfig')(modules || false);
 | |
| 
 | |
|   const pluginImportOptions = {
 | |
|     style: true,
 | |
|     libraryName: distFileBaseName,
 | |
|     libraryDirectory: 'components',
 | |
|   };
 | |
|   babelConfig.plugins.push([resolve('babel-plugin-import'), pluginImportOptions]);
 | |
| 
 | |
|   if (modules === false) {
 | |
|     babelConfig.plugins.push(require.resolve('./replaceLib'));
 | |
|   }
 | |
| 
 | |
|   /** @type {import('webpack').Configuration} */
 | |
|   const config = {
 | |
|     devtool: 'source-map',
 | |
| 
 | |
|     output: {
 | |
|       path: getProjectPath('./dist/'),
 | |
|       filename: '[name].js',
 | |
|     },
 | |
| 
 | |
|     resolve: {
 | |
|       modules: ['node_modules', path.join(__dirname, '../node_modules')],
 | |
|       extensions: [
 | |
|         '.web.tsx',
 | |
|         '.web.ts',
 | |
|         '.web.jsx',
 | |
|         '.web.js',
 | |
|         '.ts',
 | |
|         '.tsx',
 | |
|         '.js',
 | |
|         '.jsx',
 | |
|         '.vue',
 | |
|         '.md',
 | |
|         '.json',
 | |
|       ],
 | |
|       alias: {
 | |
|         '@': process.cwd(),
 | |
|       },
 | |
|       fallback: [
 | |
|         'child_process',
 | |
|         'cluster',
 | |
|         'dgram',
 | |
|         'dns',
 | |
|         'fs',
 | |
|         'module',
 | |
|         'net',
 | |
|         'readline',
 | |
|         'repl',
 | |
|         'tls',
 | |
|       ].reduce((acc, name) => Object.assign({}, acc, { [name]: 'empty' }), {}),
 | |
|     },
 | |
| 
 | |
|     module: {
 | |
|       rules: [
 | |
|         {
 | |
|           test: /\.vue$/,
 | |
|           exclude: /node_modules/,
 | |
|           use: [
 | |
|             {
 | |
|               loader: 'vue-loader',
 | |
|               options: {
 | |
|                 loaders: {
 | |
|                   js: [
 | |
|                     {
 | |
|                       loader: 'babel-loader',
 | |
|                       options: {
 | |
|                         presets: [resolve('@babel/preset-env')],
 | |
|                         plugins: [
 | |
|                           [
 | |
|                             resolve('@vue/babel-plugin-jsx'),
 | |
|                             { mergeProps: false, enableObjectSlots: false },
 | |
|                           ],
 | |
|                           resolve('@babel/plugin-proposal-object-rest-spread'),
 | |
|                         ],
 | |
|                       },
 | |
|                     },
 | |
|                   ],
 | |
|                 },
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|         },
 | |
|         {
 | |
|           test: /\.(js|jsx)$/,
 | |
|           loader: 'babel-loader',
 | |
|           exclude: /node_modules/,
 | |
|           options: babelConfig,
 | |
|         },
 | |
|         {
 | |
|           test: /\.tsx?$/,
 | |
|           use: [
 | |
|             {
 | |
|               loader: 'babel-loader',
 | |
|               options: babelConfig,
 | |
|             },
 | |
|             {
 | |
|               loader: 'ts-loader',
 | |
|               options: {
 | |
|                 transpileOnly: true,
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|         },
 | |
|         {
 | |
|           test: /\.css$/,
 | |
|           use: [
 | |
|             MiniCssExtractPlugin.loader,
 | |
|             {
 | |
|               loader: 'css-loader',
 | |
|               options: {
 | |
|                 sourceMap: true,
 | |
|               },
 | |
|             },
 | |
|             {
 | |
|               loader: 'postcss-loader',
 | |
|               options: {
 | |
|                 postcssOptions: {
 | |
|                   plugins: ['autoprefixer'],
 | |
|                 },
 | |
|                 sourceMap: true,
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|         },
 | |
|         // Images
 | |
|         {
 | |
|           test: svgRegex,
 | |
|           loader: 'url-loader',
 | |
|           options: svgOptions,
 | |
|         },
 | |
|         {
 | |
|           test: /\.(png|jpg|jpeg|gif)(\?v=\d+\.\d+\.\d+)?$/i,
 | |
|           loader: 'url-loader',
 | |
|           options: imageOptions,
 | |
|         },
 | |
|       ],
 | |
|     },
 | |
| 
 | |
|     plugins: [
 | |
|       // new BundleAnalyzerPlugin(),
 | |
|       new CaseSensitivePathsPlugin(),
 | |
|       new webpack.BannerPlugin(`
 | |
| ${pkg.name} v${pkg.version}
 | |
| 
 | |
| Copyright 2017-present, Ant Design Vue.
 | |
| All rights reserved.
 | |
|       `),
 | |
|       new WebpackBar({
 | |
|         name: 'đ  Ant Design Vue Tools',
 | |
|         color: '#2f54eb',
 | |
|       }),
 | |
|       new CleanUpStatsPlugin(),
 | |
|     ],
 | |
|     performance: {
 | |
|       hints: false,
 | |
|     },
 | |
|   };
 | |
| 
 | |
|   if (process.env.RUN_ENV === 'PRODUCTION') {
 | |
|     let entry = ['./index'];
 | |
|     config.externals = [
 | |
|       {
 | |
|         vue: {
 | |
|           root: 'Vue',
 | |
|           commonjs2: 'vue',
 | |
|           commonjs: 'vue',
 | |
|           amd: 'vue',
 | |
|           module: 'vue',
 | |
|         },
 | |
|       },
 | |
|     ];
 | |
|     if (esm) {
 | |
|       entry = ['./index.esm'];
 | |
|       config.experiments = {
 | |
|         ...config.experiments,
 | |
|         outputModule: true,
 | |
|       };
 | |
|       config.output.chunkFormat = 'module';
 | |
|       config.output.library = {
 | |
|         type: 'module',
 | |
|       };
 | |
|       config.target = 'es2019';
 | |
|     } else {
 | |
|       config.output.libraryTarget = 'umd';
 | |
|       config.output.library = distFileBaseName;
 | |
|       config.output.globalObject = 'this';
 | |
|     }
 | |
| 
 | |
|     const entryName = esm ? `${distFileBaseName}.esm` : distFileBaseName;
 | |
| 
 | |
|     config.optimization = {
 | |
|       minimizer: [
 | |
|         new TerserPlugin({
 | |
|           parallel: true,
 | |
|           terserOptions: {
 | |
|             warnings: false,
 | |
|           },
 | |
|         }),
 | |
|       ],
 | |
|     };
 | |
|     // Development
 | |
|     const uncompressedConfig = merge({}, config, {
 | |
|       entry: {
 | |
|         [entryName]: entry,
 | |
|       },
 | |
|       mode: 'development',
 | |
|       plugins: [
 | |
|         new MiniCssExtractPlugin({
 | |
|           filename: '[name].css',
 | |
|         }),
 | |
|       ],
 | |
|     });
 | |
| 
 | |
|     // Production
 | |
|     const prodConfig = merge({}, config, {
 | |
|       entry: {
 | |
|         [`${entryName}.min`]: entry,
 | |
|       },
 | |
|       mode: 'production',
 | |
|       plugins: [
 | |
|         new webpack.LoaderOptionsPlugin({
 | |
|           minimize: true,
 | |
|         }),
 | |
|         new MiniCssExtractPlugin({
 | |
|           filename: '[name].css',
 | |
|         }),
 | |
|       ],
 | |
|       optimization: {
 | |
|         minimize: true,
 | |
|         minimizer: [new CssMinimizerPlugin({})],
 | |
|       },
 | |
|     });
 | |
| 
 | |
|     return [prodConfig, uncompressedConfig];
 | |
|   }
 | |
| 
 | |
|   return [config];
 | |
| }
 | |
| 
 | |
| getWebpackConfig.webpack = webpack;
 | |
| getWebpackConfig.svgRegex = svgRegex;
 | |
| getWebpackConfig.svgOptions = svgOptions;
 | |
| getWebpackConfig.imageOptions = imageOptions;
 | |
| 
 | |
| module.exports = getWebpackConfig;
 |