222 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
| const path = require('path')
 | |
| const webpack = require('webpack')
 | |
| const ExtractTextPlugin = require('extract-text-webpack-plugin')
 | |
| const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
 | |
| const deepAssign = require('deep-assign')
 | |
| const chalk = require('chalk')
 | |
| const postcssConfig = require('./postcssConfig')
 | |
| const distFileBaseName = 'antd'
 | |
| module.exports = function (modules) {
 | |
|   const pkg = require(path.join(process.cwd(), 'package.json'))
 | |
|   const babelConfig = require('./getBabelCommonConfig')(modules || false)
 | |
| 
 | |
|   const pluginImportOptions = [
 | |
|     {
 | |
|       style: true,
 | |
|       libraryName: 'antd',
 | |
|       libraryDirectory: 'components',
 | |
|     },
 | |
|   ]
 | |
| 
 | |
|   // if (distFileBaseName !== 'antd') {
 | |
|   //   pluginImportOptions.push({
 | |
|   //     style: 'css',
 | |
|   //     libraryDirectory: 'components',
 | |
|   //     libraryName: 'antd',
 | |
|   //   })
 | |
|   // }
 | |
| 
 | |
|   babelConfig.plugins.push([
 | |
|     require.resolve('babel-plugin-import'),
 | |
|     pluginImportOptions,
 | |
|   ])
 | |
| 
 | |
|   const config = {
 | |
|     devtool: 'source-map',
 | |
| 
 | |
|     output: {
 | |
|       path: path.join(process.cwd(), './dist/'),
 | |
|       filename: '[name].js',
 | |
|     },
 | |
| 
 | |
|     resolve: {
 | |
|       modules: ['node_modules', path.join(__dirname, '../node_modules')],
 | |
|       extensions: ['.js', '.jsx', '.vue', '.md', '.json'],
 | |
|       alias: {
 | |
|         'vue$': 'vue/dist/vue.esm.js',
 | |
|         '@': process.cwd(),
 | |
|       },
 | |
|     },
 | |
| 
 | |
|     node: [
 | |
|       'child_process',
 | |
|       'cluster',
 | |
|       'dgram',
 | |
|       'dns',
 | |
|       'fs',
 | |
|       'module',
 | |
|       'net',
 | |
|       'readline',
 | |
|       'repl',
 | |
|       'tls',
 | |
|     ].reduce((acc, name) => Object.assign({}, acc, { [name]: 'empty' }), {}),
 | |
| 
 | |
|     module: {
 | |
|       noParse: [/moment.js/],
 | |
|       rules: [
 | |
|         {
 | |
|           test: /\.vue$/,
 | |
|           exclude: /node_modules/,
 | |
|           use: [
 | |
|             {
 | |
|               loader: 'vue-loader',
 | |
|               options: {
 | |
|                 loaders: {
 | |
|                   js: [
 | |
|                     { loader: 'babel-loader',
 | |
|                       options: {
 | |
|                         presets: ['env'],
 | |
|                         plugins: [
 | |
|                           'transform-vue-jsx',
 | |
|                           'transform-object-rest-spread',
 | |
|                         ],
 | |
|                       }},
 | |
|                   ],
 | |
|                 },
 | |
|               },
 | |
|             },
 | |
|           ],
 | |
|         },
 | |
|         {
 | |
|           test: /\.(js|jsx)$/,
 | |
|           loader: 'babel-loader', exclude: /node_modules/,
 | |
|           options: babelConfig,
 | |
|         },
 | |
|         {
 | |
|           test: /\.css$/,
 | |
|           use: ExtractTextPlugin.extract({
 | |
|             use: [
 | |
|               {
 | |
|                 loader: 'css-loader',
 | |
|                 options: {
 | |
|                   sourceMap: true,
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 loader: 'postcss-loader',
 | |
|                 options: Object.assign(
 | |
|                   {},
 | |
|                   postcssConfig,
 | |
|                   { sourceMap: true }
 | |
|                 ),
 | |
|               },
 | |
|             ],
 | |
|           }),
 | |
|         },
 | |
|         {
 | |
|           test: /\.less$/,
 | |
|           use: ExtractTextPlugin.extract({
 | |
|             use: [
 | |
|               {
 | |
|                 loader: 'css-loader',
 | |
|                 options: {
 | |
|                   sourceMap: true,
 | |
|                 },
 | |
|               },
 | |
|               {
 | |
|                 loader: 'postcss-loader',
 | |
|                 options: Object.assign(
 | |
|                   {},
 | |
|                   postcssConfig,
 | |
|                   { sourceMap: true }
 | |
|                 ),
 | |
|               },
 | |
|               {
 | |
|                 loader: 'less-loader',
 | |
|                 options: {
 | |
|                   sourceMap: true,
 | |
|                 },
 | |
|               },
 | |
|             ],
 | |
|           }),
 | |
|         },
 | |
|       ],
 | |
|     },
 | |
| 
 | |
|     plugins: [
 | |
|       new ExtractTextPlugin({
 | |
|         filename: '[name].css',
 | |
|         disable: false,
 | |
|         allChunks: true,
 | |
|       }),
 | |
|       new CaseSensitivePathsPlugin(),
 | |
|       new webpack.BannerPlugin(`
 | |
| ${distFileBaseName} v${pkg.version}
 | |
| 
 | |
| Copyright 2017-present, vue-antd-ui.
 | |
| All rights reserved.
 | |
|       `),
 | |
|       new webpack.ProgressPlugin((percentage, msg, addInfo) => {
 | |
|         const stream = process.stderr
 | |
|         if (stream.isTTY && percentage < 0.71) {
 | |
|           stream.cursorTo(0)
 | |
|           stream.write(`đĻ  ${chalk.magenta(msg)} (${chalk.magenta(addInfo)})`)
 | |
|           stream.clearLine(1)
 | |
|         } else if (percentage === 1) {
 | |
|           console.log(chalk.green('\nwebpack: bundle build is now finished.'))
 | |
|         }
 | |
|       }),
 | |
|     ],
 | |
|   }
 | |
| 
 | |
|   if (process.env.RUN_ENV === 'PRODUCTION') {
 | |
|     const entry = ['./index']
 | |
|     config.entry = {
 | |
|       [`${distFileBaseName}.min`]: entry,
 | |
|     }
 | |
|     config.externals = {
 | |
|       vue: {
 | |
|         root: 'Vue',
 | |
|         commonjs2: 'vue',
 | |
|         commonjs: 'vue',
 | |
|         amd: 'vue',
 | |
|       },
 | |
|     }
 | |
|     config.output.library = distFileBaseName
 | |
|     config.output.libraryTarget = 'umd'
 | |
| 
 | |
|     const uncompressedConfig = deepAssign({}, config)
 | |
| 
 | |
|     config.plugins = config.plugins.concat([
 | |
|       new webpack.optimize.UglifyJsPlugin({
 | |
|         sourceMap: true,
 | |
|         output: {
 | |
|           ascii_only: true,
 | |
|         },
 | |
|         compress: {
 | |
|           warnings: false,
 | |
|         },
 | |
|       }),
 | |
|       new webpack.optimize.ModuleConcatenationPlugin(),
 | |
|       new webpack.LoaderOptionsPlugin({
 | |
|         minimize: true,
 | |
|       }),
 | |
|       new webpack.DefinePlugin({
 | |
|         'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'),
 | |
|       }),
 | |
|     ])
 | |
| 
 | |
|     uncompressedConfig.entry = {
 | |
|       [distFileBaseName]: entry,
 | |
|     }
 | |
| 
 | |
|     uncompressedConfig.plugins.push(new webpack.DefinePlugin({
 | |
|       'process.env.NODE_ENV': JSON.stringify('development'),
 | |
|     }))
 | |
| 
 | |
|     return [config, uncompressedConfig]
 | |
|   }
 | |
| 
 | |
|   return config
 | |
| }
 |