webpack打包多页面项目,并通过process.env判断开发或者生产环境

process.env

在node中,有全局变量process表示的是当前的node进程。process.env包含着关于系统环境的信息。但是process.env中并不存在NODE_ENV这个东西。NODE_ENV是用户一个自定义的变量,在webpack中它的用途是判断生产环境或开发环境的依据的。如果想要深入的了解process.env,移步至此:理解webpack之process.env。再次就不过多讨论这个,只是下面会用到这变量。

开始安装需要的包:

需要的模块有:

  • webpack

  • webpack-cli

  • webpack-dev-server

  • node-sass

需要的loader:

  • style-loader 样式写入页面的header标签内

  • css-loader

  • sass-loader

  • file-loader 解决js、css中引入的图片

  • html-loader 解决html中引入图片问题

需要的plugins:

  • clean-webpack-plugin 删除压缩包,删除输出位置生成的文件
  • mini-css-extract-plugin 提取css到单独文件的插件
  • optimize-css-assets-webpack-plugin 引入压缩css的插件

webpack.config.js

//引入路径插件
const path = require("path");
//引入webpack
const webpack = require("webpack");
//删除压缩包,删除输出位置生成的文件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
//引入导出html插件
const htmlplugin = require('html-webpack-plugin');
//引入压缩css的插件
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
//提取css到单独文件的插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const devMode = process.env.NODE_ENV !== 'production';
console.log(process.env.NODE_ENV)


module.exports = {
    mode: "development",
    //入口
    entry: {
        home: "./src/main/index.js",
        test: "./src/main/test.js"
    },
    //出口文件
    output: {
        filename: devMode?'js/[name].boundle.js':'js/[name].[hash:4].boundle.js',
        // filename: 'js/[name].boundle.js',
        path: path.join(__dirname, "dist")
    },
    //便于调试
    devtool: 'inline-source-map',
    //服务
    devServer: {
        contentBase: path.join(__dirname, 'dist'), // 告诉服务器从哪个目录中提供内容。只有在你想要提供静态文件时才需要。
        // publicPath:path.join(__dirname, 'dist'), // 将用于确定应该从哪里提供 bundle,并且此选项优先。 此路径下的打包文件可在浏览器中访问。
        port: 9002,
        historyApiFallback: true, //当使用 HTML5 History API 时,任意的 404 响应都可能需要被替代为 index.html
        // progress: true,// 打包过程
        overlay: true,
        hot: true, //热更新
        // hotOnly: true           // 如果模块热替换功能不生效,则不刷新网页
    },
    module: {
        rules: [
            {
                test: /\.(sa|sc|c)ss$/,
                use: [
                    {
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            esModule: true,
                            // publicPath: '../',
                            hmr: true,
                        },
                    },
                    'css-loader',
                    'sass-loader',
                ],
            },
            {
                test: /\.(jpg|png|gif|svg|webp|jpeg)$/,
                use: [
                    {
                        loader: "file-loader",
                        options: {
                            name: "[name].[ext]",
                            publicPath: '/images/',
                            outputPath: 'images/'
                        }
                    }
                ]
            },
            {
                test: /\.(html|ejs)$/,
                use: [
                    {
                        loader: "html-loader",
                    },
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: devMode?'style/[name].css':'style/[name].[hash:4].css',//都提到build目录下的css目录中
            chunkFilename: devMode?'style/[id].css':'style/[id].[hash:4].css',
            // ignoreOrder: false, // Enable to remove warnings about conflicting order
        }), 
        //压缩css
        // new OptimizeCssAssetsPlugin(),
        //清除生成的文件
        new CleanWebpackPlugin(),
        //html单独导出插件——首页
        new htmlplugin({
            title: 'home-1',
            filename: 'index.html',//输出后的文件名称
            template: path.join(__dirname, 'src', 'index.html'),//打包html模版的路径和文件名称
            // favicon:'./pages/images/favicon.ico',//页签图标
            chunks: ['home'],//需要引入的js文件名称
            // inject: true,
            // hash:true, //避免缓存js。因为在MiniCssExtractPlugin已经添加的hash了,所以此处就不需要了
            // minify: {//对html文件进行压缩
            //     removeAttributeQuotes: true, //去掉属性的双引号
            //     removeComments: true,//去掉注释
            //     collapseWhitespace: true,//去掉空白
            // }
        }),
        //html单独导出插件——test页
        new htmlplugin({
            title: 'test-1',
            filename: "pages/test.html",
            template: "./src/pages/test.html",
            chunks: ['test'],
            // inject: true,
            // hash:true,
            // minify: {//压缩
            //     removeComments: true,
            //     collapseWhitespace: true
            // }
        })
    ]
}

package.json

  "scripts": {
    "dev": "NODE_ENV=development webpack-dev-server",
    "build": "NODE_ENV=production webpack"
  },

来张项目结构图:

image.png

最后再打包浏览器显示截图:

image.png

注:最后有点需要说下,如果你打开多个端口,有端口号一样的话,那么热更新就会失效的,这个坑我踩了,因为没有报错提示,所以花了点时间才发现的

你可能感兴趣的:(webpack打包多页面项目,并通过process.env判断开发或者生产环境)