zoukankan      html  css  js  c++  java
  • webpack打包多页面

    项目结构:

    直接上webpack.base.conf.js配置文件:

    const webpack = require('webpack');
    const path = require('path');
    const htmlPlugin = require('html-webpack-plugin'); //生成html模板
    const extractTextPlugin = require('extract-text-webpack-plugin'); //分离css从js里
    const { CleanWebpackPlugin } = require('clean-webpack-plugin'); //清除打包的
    var configReq = require('./config.js'); //读取配置
    const CopyWebpackPlugin = require('copy-webpack-plugin');
    const HappyPack = require('happypack'); // 多线程打包
    const os = require('os');
    const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

    var config = {
        entry: configReq.entry,
        output: {
            filename: 'js/[name]-[hash].js',
            path: path.resolve(__dirname, '../dist'),
        },
        module: {
            rules: [
                //处理es6
                {
                    test: /.js$/,
                    exclude: /node_modules/,
                    loader: 'happypack/loader?id=happyBabel',
                },
                //对js里引入css,提取到js里
                {
                    test: /.(css|scss|sass)$/,
                    use: extractTextPlugin.extract({
                        fallback: "style-loader", //编译后用什么loader来提取css文件
                        publicPath: '../', //设置css的图片路径
                        use: ["css-loader", "sass-loader"]
                    })
                },
                //压缩图片
                {
                    test: /.(png|svg|jpg|gif)$/,
                    use: [{
                        loader: 'file-loader',
                        options: {
                            outputPath: './image/' //打包后的图片放到img文件夹下
                        }
                    }]
                },
                //打包html的图片
                //html中直接使用img标签src加载图片的话,因为没有被依赖,图片将不会被打包。这个loader将解决这个问题
                {
                    test: /.(htm|html)$/i,
                    use: ['html-withimg-loader']
                },
            ]
        },
        plugins: [
            new webpack.BannerPlugin('版权所有,翻版必究'),
            new CleanWebpackPlugin(),
            new extractTextPlugin("css/[name]-[hash].css"), //提取CSS行内样式,转化为link引入
            new CopyWebpackPlugin([{
                from: path.resolve(__dirname, '../src/assets'),
                to: './assets'
            }]),
            new HappyPack({
                //用id来标识 happypack处理那里类文件
                id: 'happyBabel',
                //如何处理  用法和loader 的配置一样
                loaders: [{
                    loader: 'babel-loader?cacheDirectory=true',
                }],
                //共享进程池
                threadPool: happyThreadPool,
                //允许 HappyPack 输出日志
                verbose: true,
            }),
        ],
        optimization: {
            minimizer: [],
            //打包公共模块
            splitChunks: {
                cacheGroups: {
                    commons: {
                        chunks: 'initial', //initial表示提取入口文件的公共部分
                        minChunks: 20, //表示提取公共部分最少的文件数
                        minSize: 0, //表示提取公共部分最小的大小
                        name: 'commons' //提取出来的文件命名
                    }
                }
            }
        }
    };
    module.exports = config;
    //生成模版文件
    configReq.htmlConfig.forEach((val, i) => {
        var hcoging = {
            template: "./src/" + val.name + ".html", //new 一个这个插件的实例,并传入相关的参数
            filename: val.name + ".html",
            chunks: [val.name, "commons"],
            inject: true,
            minify: { //压缩HTML文件
                removeComments: true, //移除HTML中的注释
                removeAttributeQuotes: true, //removeAttrubuteQuotes是去掉属性的双引号。
                collapseWhitespace: false //删除空白符与换行符
            }
        }
        config.plugins.push(new htmlPlugin(hcoging));
    })

     webpack.dev.conf.js配置文件:

    //引入webpack-merge插件进行合并
    const merge = require('webpack-merge');
    //引入webpack.base.conf.js文件
    const base = require('./webpack.base.conf');
    //引入webpack
    const webpack = require('webpack');
    //进行合并,将webpack.base.conf.js中的配置合并到这
    module.exports = merge(base, {
        //模块参数
        mode: 'development',
        devServer: {
            contentBase: "./dist", //本地服务器所加载的页面所在的目录
            port: "8089", //设置默认监听端口,如果省略,默认为"8080"
            inline: true, //实时刷新
            historyApiFallback: true, //不跳转
            //代理转发接口
            proxy: {
                //把/api/t转发到target,但是转发的是http://xxx/api/t
                //不要/api,用pathRewrite
                '/api': {
                    target: 'xxx', //(跨域的地址)
                    changeOrigin: true, // target是域名的话,需要这个参数,
                    secure: false, // 设置支持https协议的代理
                    pathRewrite: {
                        '^/api': ''
                    }
                }
            }
        },
        //启用source-map方便调试
        devtool: 'source-map',
        plugins: [
            //定义全局变量
            new webpack.DefinePlugin({
                //这里必须要解析成字符串进行判断,不然将会被识别为一个变量
                DEV: JSON.stringify('dev')
            })
        ]
    });

    webpack.prod.conf.js配置文件:

    const merge = require('webpack-merge');
    const base = require('./webpack.base.conf');
    
    const path = require('path');
    const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); //压缩css
    const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); //压缩js
    const webpack = require('webpack');
    
    module.exports = merge(base, {
        mode: 'production',
        optimization: {
            minimizer: [
                //压缩CSS代码
                new OptimizeCSSAssetsPlugin({}),
                //压缩js代码
                new UglifyJsPlugin({
                    //启用文件缓存
                    cache: true,
                    //使用多线程并行运行提高构建速度
                    parallel: true,
                    //使用 SourceMaps 将错误信息的位置映射到模块
                    sourceMap: true
                })
            ]
        },
        plugins: [
            //使用插件定义全局变量DEV
            new webpack.DefinePlugin({
                DEV: JSON.stringify('production')
            })
        ]
    
    });

    多页面html页面模板文件config.js:

    const webpack = require('webpack');
    //入口配置 ssdsd
    var entry = {
            index: './src/js/index.js',
            index1: './src/js/index1.js',
            index2: './src/js/index2.js',
        }
        //页面配置
    var htmlConfig = [{
        name: "index",
    }, {
        name: "index1",
    }, {
        name: "index2",
    }];
    module.exports = {
        entry: entry,
        htmlConfig: htmlConfig
    }

    .babelrc文件

    {
        "presets": [
          "@babel/preset-env"
        ]
      }
    # jq-webpack
    # 多页面(jq)项目用webpack打包
    # 需要的插件,直接在页面(html)上引用
    # 运行npm run server
    # 打包npm run build
    # 若要promise,在该页面引用,import "babel-polyfill"; //解决低版本浏览器,不识别promise问题
     
    补充:
    写webpack配置的时候,经常存在路径的问题
    __dirname是node的内置package,值得是当前文件的绝对路径;
    path.resolve也是node的内置package,主要是把to后的参数也转化成绝对路径;
    path.resolve(__dirname, '../dist'),
  • 相关阅读:
    [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
    [Docker]
    [Docker]
    [Docker]
    [Windows]
    [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版
    [Linux]
    [.Net] 什么是线程安全的并发集合
    [IOT]
    c++库大全
  • 原文地址:https://www.cnblogs.com/ssszjh/p/12567038.html
Copyright © 2011-2022 走看看