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 }