likes
comments
collection
share

webpack.config.js 配置

作者站长头像
站长
· 阅读数 83

这个是webpack.base.js 文件


const dev = require('./webpack.dev.js')
const prod = require('./webpack.prod.js')
const path = require('path')
const merge = require('webpack-merge')
const HtmlWebpackPlugin = require('html-webpack-plugin') // 自动生成html 文件并且引入打包后的js 内容
// const CleanWebpackPlugin = require('clean-webpack-plugin') // 每次打包清除dist下的目录
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

// 引用vue 还需要一个插件在loader中
const VueLoaderPlugin = reuqire('vue-loader/lib/plugin')

const glob = require('glob') // 主要功能就是查找配置文件
// let paths = glob.sync("../src/**/*", {nodir: true})
// 主要删除无意义的css  只能配合 mini-css-extract-plugin
const PurgeCssWebapckPlugin = reuqire('purgecss-webpack-plugin')


const AddCdnPlugin = require('add-asset-html-cdn-webpack-plugin')

const DLLReferencePlugin = require('webpack').DllReferencePlugin

const AddAssetHtmlPlugin = require('add-asset-html-plugin')

const { BundleAnalyzerPlugin} = require('webpack-bundle-analyzer')

module.exports = (env) => {
    let isDev = env.development
    const base = {
        // entry: path.resolve(__dirname, '../src/index.js'), // 写路径都采用绝对路径
        entry:{
            "a": path.resolve(__dirname, '../src/a.js'),
            "b": path.resolve(__dirname, '../src/b.js')
        },
        optimization: {
            splitChunks: {
                chunks: 'async', // 默认支持异步的代码分割 import()
                minSize: 30000, // 文件超过30000k就会抽离
                maxSize: 0,
                minChunks: 1, // 模块最少引用一次才抽离
                maxAsyncRequests: 5, // z最多5个请求
                maxInitialRequests: 3, // 最多首屏加载3个请求
                automaticNameDelimiter: '~', // xxx a~b
                automaticNameMaxLength: 30, // zuzu最长名字打大小
                name: true,
                cacheGroups: { // 缓存组
                    vendors: {
                        test: /[\\/]node_modules[\\/]/,
                        priority: -10,
                    },
                    default: {
                        minChunks: 2,
                        priority: -20,
                        reuseExistingChunk: true
                    }
                }
            }
        },
        externals: {
            'jquery': '$' // b不去打包代码中的jquery
        },
        module: {
            // 转化什么文件,用什么去转 用哪些loader
            // loader 写法 {} [] ''
            // 解析css的时候就不能渲染dom 所以搞个插件 可以并行 js 一起加载 mini-css-extract-plugin
            rules: [
                {
                    test: /\.vue$/,
                    loader: 'vue-loader' // 新建一个.babelrc 默认调用这个文件
                },
                {
                    test: /\.tsx?$/,
                    loader: 'babel-loader' // 新建一个.babelrc 默认调用这个文件
                },
                {
                    test: /\.js$/,
                    loader: 'babel-loader' // 新建一个.babelrc 默认调用这个文件
                },
                {
                    tets: /\.css$/,
                    // use: ['style-loader', 'css-laoder']
                    // 有这样的情况 css文件中再引用scss文件 scss可能还会在引用css
                    use: [
                        // 开发环境 style-loader 生产用这个并行的
                        isDev ? 'style-loader': MiniCssExtractPlugin, {
                        loader: 'css-loader',
                        options: {
                            importLoaders: 2 // 对应后边第二个loader
                        }
                    },'postcss-loader', 'sass-loader']
                },
                {
                    tets: /\.scss$/,
                    use: ['style-loader', 'css-loader', 'sass-loader']
                },
                // 图标的
                {
                    test: /\.(woff|ttf|eot|svg)$/,
                    use: 'file-loader'
                },
                {
                    test: /\.(jpe?g|gif|png|bmp)$/,
                    use: [{
                        loader: 'url-laoder',
                        options: {
                            name: 'image/[chunkhash].[ext]',
                            limit: 8 * 1024
                        }
                    }, {
                        loader: 'image-webpack-loader',
                        options: {
                            pngquant: {
                                quality: [0.65, 0.90],
                                speed: 4
                            }
                        }
                    }]
                    // 'file-loader' // m默认的功能是拷贝
                    // 但是希望当前比较小的图片转为base64 大小会比之前大点好处就是不需要请求接口
                }
            ]
        },
        // c出口
        output: {
            filename: '[name].js', // 同步打包的名字
            chunkFilename: '[name].min.js',
            path: path.resolve(__dirname, '../dist')
        },
        plugins: [
             new MiniCssExtractPlugin({ // 开发环境不使用
                filename: 'css/main.css'
            }),
            new PurgeCssWebapckPlugin({
                paths: glob.sync('../src/**/*', {nodir: true})
            }),
            new VueLoaderPlugin(),
            // new CleanWebpackPlugin(),// 默认全部清除 z这个应该在 生产环境
            new HtmlWebpackPlugin({
                template: path.resolve(__dirname, '../public/index.html'),
                filename: 'index.html',
                chunksSortMode: 'manual',
                chunks: ["a"],
                minify: !isDev && {
                    removeAttributeQuotes: true,
                    collapseWhitespace: true //  压缩为一行
                }
            }),
            new HtmlWebpackPlugin({
                template: path.resolve(__dirname, '../public/index.html'),
                filename: 'login.html',
                chunksSortMode: 'manual', // sho手动排序 先b后a
                chunks: ["b", "a"],
                minify: !isDev && {
                    removeAttributeQuotes: true,
                    collapseWhitespace: true //  压缩为一行
                }
            }),
            new AddCdnPlugin(true, {
                'jquery': 'https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js'
            }),
            new DLLReferencePlugin ({
                manifest: path.resolve(__dirname, 'dll/manifest.json')
            }),
            !isDev && new AddAssetHtmlPlugin({
                filename: path.resolve(__dirname, './dll/react.dll.js')
            }),
            new BundleAnalyzerPlugin()
        ].filter(Boolean)
    }
    // 函数要返回配置文件 没有返回会采用默认配置
    if (isDev) {
        return merge(base, dev)
    } else {
        return merge(base, prod)
    }
}

这个是webpack.dev.js的文件



const path = require('path')

module.exports = {
    mode: 'development',
    devServer: { // 开发服务配置
        port: 8000,
        compress: true, // gzip 可以提升返回页面的速度
        contentBase: path.resolve(__dirname, '../dist')
    }
}

这个是webpack.prod.js文件



const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const TerserWebpackPlugin = require('terser-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin') // 每次打包清除dist下的目录

module.exports = {
    mode: 'production',
    optimization: { // 优化项
        minimizer: [ // 可以放置压缩方案
            new OptimizeCSSAssetsPlugin(), // 用了这个 js也得手动配置压缩
            new TerserWebpackPlugin()
        ]

    },
    plugins: [
        new CleanWebpackPlugin(),// 默认全部清除
    ]
}
转载自:https://juejin.cn/post/7069430793218555911
评论
请登录