192 lines
6.5 KiB
JavaScript
192 lines
6.5 KiB
JavaScript
|
const glob = require('glob') // 处理文件路径用到,很有用
|
|||
|
const path = require('path')
|
|||
|
const fs = require('fs')
|
|||
|
const chalk = require('chalk')
|
|||
|
const HtmlWebpackPlugin = require('html-webpack-plugin') // 将打包后js自动引入html文件插件
|
|||
|
const { CleanWebpackPlugin } = require('clean-webpack-plugin') // 清除打包文件工具
|
|||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 分离css
|
|||
|
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin') // css压缩去重
|
|||
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin // 可视化分析
|
|||
|
const cleanPath = [path.join(__dirname, './dist')]
|
|||
|
// 多页面配置函数
|
|||
|
const pagesSetting = () => {
|
|||
|
const entries = {}
|
|||
|
const htmlWebpackPlugins = []
|
|||
|
const files = glob.sync(path.join(__dirname, './src/pages/**/*.js'))
|
|||
|
files.forEach((file) => {
|
|||
|
const match = file.match(/\/pages\/(.*)\/(.*).js$/)
|
|||
|
const entry = match && match[1] // 文件夹
|
|||
|
// 保存入口文件
|
|||
|
entries[entry] = file
|
|||
|
const pageFiles = fs.readdirSync(path.resolve(file, '..'))
|
|||
|
const htmlFile = pageFiles.filter((file) => /\.html$/.test(file))
|
|||
|
if (htmlFile.length > 0) {
|
|||
|
htmlWebpackPlugins.push(new HtmlWebpackPlugin({
|
|||
|
template: path.join(__dirname, `./src/pages/${entry}/${htmlFile[0]}`),
|
|||
|
filename: `${htmlFile[0]}`,
|
|||
|
chunks: [entry],
|
|||
|
inject: true, // 将js放在body底部
|
|||
|
minify: {
|
|||
|
collapseWhitespace: true, // 折叠标签空白
|
|||
|
minifyCSS: true,
|
|||
|
minifyJS: true
|
|||
|
}
|
|||
|
}))
|
|||
|
} else {
|
|||
|
console.log(chalk.red(`${path.resolve(file, '..')}目录下无模板文件`))
|
|||
|
}
|
|||
|
})
|
|||
|
return {
|
|||
|
entries,
|
|||
|
htmlWebpackPlugins
|
|||
|
}
|
|||
|
}
|
|||
|
const { entries, htmlWebpackPlugins } = pagesSetting()
|
|||
|
module.exports = {
|
|||
|
mode: 'development',
|
|||
|
entry: entries,
|
|||
|
output: {
|
|||
|
path: path.resolve(__dirname, './dist'),
|
|||
|
filename: "[name].[chunkhash:8].js",
|
|||
|
},
|
|||
|
module: {
|
|||
|
rules: [
|
|||
|
{
|
|||
|
test: /\.js$/,
|
|||
|
exclude: /(node_modules|bower_components)/,
|
|||
|
use: {
|
|||
|
loader: 'babel-loader',
|
|||
|
options: {
|
|||
|
"presets": [
|
|||
|
["@babel/preset-env", {
|
|||
|
"modules": false,
|
|||
|
"targets": {
|
|||
|
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
|
|||
|
},
|
|||
|
"useBuiltIns": "usage"
|
|||
|
}]
|
|||
|
],
|
|||
|
"plugins": [
|
|||
|
"@babel/plugin-transform-runtime"
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.css$/,
|
|||
|
use: [
|
|||
|
MiniCssExtractPlugin.loader,
|
|||
|
{ loader: 'css-loader' },
|
|||
|
{ loader: "postcss-loader" }
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.less$/,
|
|||
|
use: [
|
|||
|
MiniCssExtractPlugin.loader,
|
|||
|
{ loader: 'css-loader' },
|
|||
|
{ loader: "postcss-loader" },
|
|||
|
{ loader: 'less-loader' }
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.scss$/,
|
|||
|
use: [
|
|||
|
MiniCssExtractPlugin.loader,
|
|||
|
{ loader: 'css-loader' },
|
|||
|
{ loader: "postcss-loader" },
|
|||
|
{ loader: 'sass-loader' }
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.styl$/,
|
|||
|
use: [
|
|||
|
MiniCssExtractPlugin.loader,
|
|||
|
{ loader: 'css-loader' },
|
|||
|
{ loader: "postcss-loader" },
|
|||
|
{ loader: 'stylus-loader' }
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.(bmp|png|jpg|jpeg|ico|gif)$/,
|
|||
|
use: [
|
|||
|
{
|
|||
|
loader: 'url-loader',
|
|||
|
options: {
|
|||
|
limit: 1024 * 12, // 文件小于12kb,输出DataUrl
|
|||
|
outputPath: 'assets/images', // 该路径相对于html输出路径
|
|||
|
publicPath: '../../assets/images',
|
|||
|
name: '[name].[ext]'
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.html$/,
|
|||
|
use: [
|
|||
|
{
|
|||
|
loader: 'html-loader',
|
|||
|
options: {
|
|||
|
attrs: ['img:src', 'img:data-src', 'audio:src'],
|
|||
|
minimize: false,
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
test: /\.(woff2?|woff|svg|eot|ttf)(\?.*)?$/,
|
|||
|
use: [
|
|||
|
{
|
|||
|
loader: "url-loader",
|
|||
|
options: {
|
|||
|
name: "[name].[ext]",
|
|||
|
limit: 1024 * 5,
|
|||
|
outputPath: 'assets/fonts/'
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
plugins: [
|
|||
|
...htmlWebpackPlugins,
|
|||
|
new CleanWebpackPlugin({
|
|||
|
cleanOnceBeforeBuildPatterns: cleanPath
|
|||
|
}),
|
|||
|
new MiniCssExtractPlugin({
|
|||
|
filename: 'pages/[name]/[name].[chunkhash:8].css',
|
|||
|
}),
|
|||
|
new OptimizeCssAssetsPlugin({
|
|||
|
assetNameRegExp: /\.css$/g,
|
|||
|
cssProcessor: require('cssnano'),
|
|||
|
cssProcessorPluginOptions: {
|
|||
|
preset: [
|
|||
|
'default',
|
|||
|
{ discardComments: { removeAll: true } }
|
|||
|
],
|
|||
|
},
|
|||
|
canPrint: true
|
|||
|
}),
|
|||
|
// new BundleAnalyzerPlugin()
|
|||
|
],
|
|||
|
devServer: {
|
|||
|
host: "circuit.dianwutong.com",
|
|||
|
open: false,
|
|||
|
port: 8083,
|
|||
|
compress: true,
|
|||
|
historyApiFallback: {
|
|||
|
rewrites: [
|
|||
|
{ from: /^\/draw/, to: '/draw.html' },
|
|||
|
{ from: /^\/run/, to: '/run.html' },
|
|||
|
{ from: /./, to: '/draw.html' },
|
|||
|
]
|
|||
|
},
|
|||
|
// proxy: {
|
|||
|
// '/ems': {
|
|||
|
// target: 'http://api.dianwutong.com',
|
|||
|
// changeOrigin: true
|
|||
|
// }
|
|||
|
// }
|
|||
|
}
|
|||
|
}
|