|
|
|
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
|
|
|
|
}
|