webpack5区分生产环境打包文件(通过环境变量区分)

2023-11-07

webpack5区分生产环境打包文件

package.json

{
  "name": "webpeck",
  "version": "1.0.0",
  "description": "",
  "main": "./index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/core": "^7.15.0",
    "@babel/preset-env": "^7.15.0",
    "autoprefixer": "^10.3.1",
    "babel-loader": "^8.2.2",
    "core-js": "^3.16.2",
    "css-loader": "^6.2.0",
    "file-loader": "^6.2.0",
    "html-loader": "^2.1.2",
    "html-webpack-plugin": "^5.3.2",
    "mini-css-extract-plugin": "^2.2.0",
    "optimize-css-assets-webpack-plugin": "^6.0.1",
    "postcss-loader": "^6.1.1",
    "style-loader": "^3.2.1",
    "url-loader": "^4.1.1",
    "webpack": "^5.50.0",
    "webpack-cli": "^3.3.12",
    "webpack-dev-server": "^3.11.2"
  },
  "browserslist": [
    "last 1 version",
    "> 1%"
  ]
}

webpack.config.js

/* 
    webpack.config.js  webpack的配置文件
    作用:当运行webpack的指令时,会加载其中的配置

    所有的构建工具都是基于nodejs运行的,模块化采用的是commenjs
*/
// resolve用来拼接绝对路径
const { resolve } = require('path');
// 引入html-webpack-plugin   作用:复制html文件
const htmlPlugin = require('html-webpack-plugin');
// 引入mini-css-extract-plugin  作用:将css文件从中提取出来
const miniCss = require('mini-css-extract-plugin');
// 引入optimize-css-assets-webpack-plugin  作用:用于压缩css
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
module.exports = (env,argv)=>{
    const config = {
        // 入口起点
        // entry: "./src/js/index.js",
        // 多入口打包:
        entry: {
            'index':'./src/js/index.js',
            'about':'./src/js/about.js'
        },
        // 输出
        output: {
            // 输出文件名
            filename: "js/[name].[contenthash:8].js",
            // 输出路径  __dirname,nodejs的变量,代表当前的绝对路径
            path: resolve(__dirname, "build")
        },
        // 优化策略:配置提取公共资源
        optimization: {
            splitChunks: {
                chunks:'all'
            }
        },
        // 启用source-map定位问题
        devtool:'source-map',
        // loader配置
        module: {
            // 在rules中配置详细的loader
            rules: [
                // 处理css文件
                {
                    // 匹配文件名,文件名结尾为.css的文件
                    test: /\.css$/,
                    // 使用loader进行处理
                    use: [
                        // use数组中执行顺序,从右到左,从下到上   依次执行
                        // 创建一个style标签,将js中的样式插入到style标签中,再插入到head中
                        // 'style-loader',
                        // 不添加到页面的style中,单独提取css文件
                        miniCss.loader,
                        // 将css文件变成commenjs模块加载进js中,里面内容是样式字符串
                        'css-loader',
                        // 添加css前缀(为了浏览器兼容性)
                        'postcss-loader'
                    ]
                },
                // 处理css中引入的图片资源
                {
    
                    // 问题:处理不了html中的img图片
                    test: /\.(jpg|JPG|png|PNG|gif|GIF)$/,
                    // 使用loader:url-loader, file-loader
                    loader: 'url-loader',
                    options: {
                        // 图片大小如果小于8kb,就会被base64处理
                        // 优点:减轻服务器的压力
                        // 缺点:图片体积会变大,文件请求速度会变慢
                        limit: 8 * 1024,
                        // 问题:因为url-loader默认使用的是es6模块化解析,而html-loader引入图片使用的是commonjs
                        // 解析img引入的图片就会出现问题
                        // 所以用下面这行代码进行解决,关闭es6的模块化解析,使用commomjs解析
                        esModule: false,
                        // 打包后的图片名太长,所以我们可以给图片名重命名
                        // 取hash值的前十位,并使用原来的图片扩展名[ext]
                        name: '[hash:10].[ext]',
                        // 指定打包指向目录
                        outputPath: 'img/'
                    }
                },
                // 处理html中img引入的图片资源
                {
                    test: /\.html$/,
                    // 处理html中的img引入的图片,引入后会被url-loader进行处理
                    // loader: 'html-loader',
                    loader: 'html-loader',
                    options: {
                        esModule: false,
                    }
    
                },
                // 处理其他资源
                {
                    // 排除掉所需资源
                    exclude: /\.(css|html|js|jpg|JPG|png|PNG|gif|GIF)$/,
                    // 使用file-loader
                    loader: 'file-loader',
                    options: {
                        name: '[contenthash:10].[ext]',
                        outputPath: 'media'
                    },
    
                },
                // 配置babel
                {
                    // 匹配
                    test: /\.m?js$/,
                    // 排除配置文件,不用转译
                    exclude: /node_modules/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            // 第二次构建时,会读取之前的缓存
                            cacheDirectory:true,
                            presets: [
                                [
                                    '@babel/preset-env',
                                    {
                                        // 指定按需加载
                                        useBuiltIns:"usage",
                                        // 指定core-js版本
                                        corejs:3,
                                        targets: "defaults"
                                    }
                                ]
                            ]
                        }
                    }
                }
            ]
        },
        // plugins配置
        plugins: [
            // html-webpack-plugin
            // 功能:默认会创建一个空的html文件,并且将打包的资源引入到html中
            // 创建一个html的plugin对象
            new htmlPlugin({
                // 作用:复制目录下的html文件,并引入资源
                template: './src/index.html',
                // 指定要加载的打包js文件
                chunks:['index'],
                minify: {
                    // 清理空格和换行符
                    collapseWhitespace:true,
                    // 保持单行标签的尾部斜杠
                    keepClosingSlash:true,
                    // 去掉html注释
                    removeComments:true,
                    // 当值与默认值匹配时删除属性
                    removeRedundantAttributes:true,
                    // type="text/javascript"从script标签中删除。其他type属性值保持不变
                    removeScriptTypeAttributes:true,
                    // type="text/css"从style和link标记中删除。其他type属性值保持不变
                    removeStyleLinkTypeAttributes:true,
                    // doctype用简短的 (HTML5) doctype替换
                    useShortDoctype:true
                }
            }),
            // 提取css文件的配置
            new miniCss({
                filename: 'css/[name].[contenthash:8].css'
            }),
            // 压缩css配置
            new OptimizeCssAssetsPlugin()
        ],
        // 打包环境
        // mode: 'development',// 开发模式
        mode:'production',  // 生产模式
    
        // 启动devServer指令:npx webpack-dev-server
        devServer: {
            // 打包目标文件目录
            contentBase: resolve(__dirname, 'build'),
            // 启动gzip压缩
            compress: true,
            // 端口号
            port: 3000,
            // 启动成功自动打开浏览器
            open: true
        }
    }
    // 判断是否是开发环境打包
    if(env.development) {
        config.mode = 'development',
        config.plugins = [
            // html-webpack-plugin
            // 功能:默认会创建一个空的html文件,并且将打包的资源引入到html中
            // 创建一个html的plugin对象
            new htmlPlugin({
                // 作用:复制目录下的html文件,并引入资源
                template: './src/index.html',
                // 指定要加载的打包js文件
                chunks:['index']
            }),
            // 提取css文件的配置
            new miniCss({
                filename: 'css/[name].[contenthash:8].css'
            })
        ]
    }
    // 返回配置
    return config;
}

如需生产环境打包(会压缩文件)
webpack

如需开发环境打包(不会压缩文件)
webpack --env development

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webpack5区分生产环境打包文件(通过环境变量区分) 的相关文章

随机推荐

  • adb命令卸载(系统app)遇到:Failure [DELETE_FAILED_DEVICE_POLICY_MANAGER]

    普通卸载 所有软件的包名 adb shell pm list packages 卸载命令 adb uninstall 包名 Failure DELETE FAILED INTERNAL ERROR 之后rm apk卸载 貌似只能一次卸载一个
  • 聊聊运算放大器---施密特与迟滞比较器

    很多人把施密特触发器与迟滞比较器混为一谈 以为是一样的东西 其实不然 虽然二者都是带有2个门限的正反馈比较器 还是有具体区别的 1 施密特触发器可以买到专用的芯片 如74HC14 其门限电压UT UT 是固定值 注意均为正电压 2 迟滞触发
  • KubeSphere 社区双周报

    KubeSphere 从诞生的第一天起便秉持着开源 开放的理念 并且以社区的方式成长 如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一 这些都离不开社区小伙伴的共同努力 你们为 KubeSphere 提出了很多建设性意见
  • Vue基础之模板语法介绍

    目录 前言 一 插值 二 指令 三 过滤器 四 计算属性和监听属性 五 vue实现购物车案例 前言 上篇我分享了关于Vue的入门 简单的入了个门 本篇文章将要分享的内容为Vue的模板语法 一 插值 1 1 文本 1 2 html 1 3 属
  • 大数据基础——MySql篇

    MySql 什么是数据库 数据库 保存数据的仓库 他在电脑中是一个文件系统 然后把数据都保存在这些特殊的文件中 并且使用固定的语言 SQL语言 去操作文件中的数据 数据库就是按照数据结构来组织 存储和管理数据的建立在计算机存储设备上的仓库
  • 数据库面试

    数据库知识点 是否了解内存数据库 顾名思义就是将数据放在内存中直接操作的数据库 相对于磁盘 传统的数据库管理系统把所有数据都放在磁盘上进行管理 所以称做磁盘数据库 内存的数据读写速度要高出几个数量级 因此内存数据库的最大特点就是性能好 速度
  • 让CPU画出图形(其实很简单的)

    本例子是当初微软的一个题目 希望windows任务管理器的CPU的占有率 是一个正旋曲线 如果是你 你会如何解决这个问题呢 先上图吧 由于cpu要处理其他电脑程序 只能画出来大概的模样 其实我当时想这个问题时候 是不是考虑对cpu进行操作
  • JS中Symbol的介绍

    1 引入Symbol类型的背景 ES5 的对象属性名都是字符串 这容易造成属性名冲突的问题 举例 使用别人的模块 对象 又想为之添加新的属性 这就容易使得新属性名与原有属性名冲突 2 Symbol类型简介 symbol是一种原始数据类型 其
  • 计算机网络---第五章传输层---UDP

    1UDP的端口号是53 需要应用层提供可靠性服务 2网络层的复分用指的是协议 传输层的复分用指的是进程 3UDP首部为8B 伪首部长度为12B 5使用UDP协议的原因在于要找到目的进程以及更加可靠 6IP电话实时媒体会议流媒体使用UDP 7
  • MySQL复习

    MySQL学习 1 初始MySQL 1 1 什么是数据库 数据库 DB BataBase 作用 存储数据 管理数据 1 2 数据库分类 关系型数据库 SQL MySQL Oracle sql Server 各个表之间 表中行和列之间的关系进
  • js对象属性的命名规范

    1 首先 我们要知道 js对象属性命名有三种方法 1 对象字面量形式命名 这时的属性 可以是任意的字符串 包括空串和空格字符串 也可以是js的变量形式 即以字母 下划线 开头 后面跟字母 数字 下划线和 还可以是纯数字 let obj a1
  • 华为服务器imana安装系统,华为服务器imana配置

    华为服务器imana配置 内容精选 换一换 当前 越来越多的软件采用微服务架构 构建一个产品时会大量使用微服务 不同微服务之间访问时涉及到域名访问 拥有自建IDC的企业 在使用CCE时通常需要在CCE集群与自建IDC之间通信 而且当IDC有
  • Python+Django实现基于人脸识别的门禁管理系统,附带源码!!

    已下项目为实战开发经验 微信搜索关注公众号 python语言空间 获取更多项目源码及资源 项目介绍 基于人脸识别的门禁管理系统 Python Django RESTframework JsonWebToken Redis Dlib 该项目为
  • redhat 红帽7.8安装教程(图文超详细)

    1 打开vm创建 点击创建虚拟机 选择Linux 红帽7系列版本 这个网络类型无所谓 后期还可以改 方向键上下来控制选择第一个 然后按enter Ctrl Alt可以把光标从虚拟机中拉出来 后边还需要创建新的一个用户 密码需要有高安全性
  • 一、在linux下安装jenkins

    前提 在linux中已经安装了jdk 1 安装jenkins的方式一 直接使用命令下载 官网 https pkg origin jenkins io redhat sudo wget O etc yum repos d jenkins re
  • 面试题:有一个箱子容积为v,同时有n个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。

    面试题 有一个箱子容积为v 同时有n个物品 每个物品有一个体积 要求从n个物品中 任取若干个装入箱内 使箱子的剩余空间最小 输入 箱子的容积 v 物品个数 n 每个物品占的空间 x1 x2 xn 输出 最小剩余空间 s 解题思路 背包类动态
  • SpringCloud服务调用(RestTemplate)

    文章目录 RestTemplate介绍 RestTemplate方法介绍 RestTemplate调用微服务 使用微服务架构的分布式系统 微服务之间通过网络通信 我们通过服务提供者与服务消费者来描述微服务间的调用关系 服务提供者 服务的被调
  • 桌面在计算机的路径,电脑桌面文件存放路径

    电脑桌面存放的文件路径 系统默认配置是这样的 sytemroot Documents and Settings 用户名 桌面 要想某个登录账户的桌面文件放到桌面的时候实际存储在非系统分区下的任意路径该如何操作呢 解决办法是 修改注册表法如下
  • 腾讯云服务器镜像TencentOS Server操作系统详细介绍

    腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统 完全兼容CentOS生态和操作方式 TencentOS Server操作系统为云上运行的应用程序提供稳定 安全和高性能的执行环境 TencentOS可以运行在腾讯云
  • webpack5区分生产环境打包文件(通过环境变量区分)

    webpack5区分生产环境打包文件 package json name webpeck version 1 0 0 description main index js scripts test echo Error no test spe