使用webpack打包react组件笔记:
自定义一个打包script,在package.json的script里面执行命令: webpack --config ./scripts/build.js
const path = require('path');
const webpack = require('webpack');
const TerserPlugin = require('terser-webpack-plugin');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const { version, name, description } = require('../package.json');
const config = {
mode: 'production',
// 入口
entry: './src/index.ts',
// 出口,打umd包
output: {
library: name,
libraryTarget: 'umd',
umdNamedDefine: true,
filename: '[name].js'
},
//react react-dom do not package
externals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
}
},
resolve: {
enforceExtension: false,
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json', '.scss', '.css']
},
module: {
rules: [
{
test: /\.(js|ts)[x]?$/,
use: [
{
loader: 'babel-loader'
}
],
exclude: '/node_modules/',
include: [path.resolve('components')]
},
{
test: /\.(sc|c)ss$/,
exclude: /\.module\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
},
{
test: /\.module\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
sourceMap: false,
modules: {}
}
},
'postcss-loader',
'sass-loader'
]
},
{
test: /\.(jpg|jpeg|png|gif|svg)$/,
use: [
{
loader: 'url-loader',
options: {
name: 'images/[name][hash:8].[ext]'
}
}
]
}
]
},
optimization: {
minimizer: [
new TerserPlugin({
include: /\.min\.js$/,
parallel: true,
extractComments: false,
terserOptions: {
output: {
comments: false
}
}
})
],
noEmitOnErrors: true
},
plugins: [
new ProgressBarPlugin(),
// version info
new webpack.BannerPlugin(
` \n ${name} v${version} \n ${description} \n ${LOGO}\n`
),
new webpack.DefinePlugin({
'process.env.NODE_ENV': 'production',
__DEBUG__: false
}),
new webpack.LoaderOptionsPlugin({
minimize: true
}),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
]
};
module.exports = config;