热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webpack二刷之五、生产环境优化(1.环境配置全局变量)

生产环境优化开发环境注重开发效率,生产环境注重运行效率。开发环境所使用的soucremap和HMR等webpack特性会生成或向打包文件中添加一些生产环境用不到的

生产环境优化

开发环境注重开发效率,生产环境注重运行效率。

开发环境所使用的soucre map和HMR等webpack特性会 生成 或 向打包文件中添加 一些生产环境用不到的内容。

针对这个问题,webpack4推出了 模式(mode)

它提供了不同模式下的预设配置。

其中 production 模式内部开启了很多通用的优化功能。

同时,webpack也建议开发者为不同的工作环境创建不同的配置。

不同环境下的配置


方式1:配置文件根据环境不同,导出不同的配置(中小型项目)

webpack配置文件可以导出一个返回配置对象的函数(env,argv) => { return {...} }

函数接收两个参数:

env接收cli命令中的环境名(--env)参数

aegv是cli命令中的所有参数

如此,就可以在函数中根据env判断,对配置做调整。

也可以通过环境变量来判断。

这种方式只适合中小型项目,因为随着项目变得复杂,不同环境的配置也变得复杂起来,不方便在一个配置文件中去维护。

对于大型项目还是建议使用,一个环境对应一个配置文件的方式去维护。

方式2:一个环境对应一个配置文件(大型项目)

一般项目中会配置3个 环境的配置文件。其中两个用来适配不同的环境(dev/development、prod/production),另一个存放公共的配置(common/base)。

在dev和prod配置文件中,导入公共配置对象common并将其复制到当前导出的对象中,最后用当前环境的配置对象覆盖。

由于Object.assign()是浅拷贝,使用它来覆盖公共配置是不合适的。

可以使用webpack-merge模块完成合并webpack配置的需求,它内部自动处理合并的逻辑。

由于现在没有默认的配置文件(webpack.config.js),所以需要使用--config参数指定使用的配置文件。

例如:yarn webpack --config webpack.prod.js

可以将命令配置到package.json的scripts中。

DefinePlugin 插件 注入全局成员

DefinePlugin 插件用于为代码注入全局成员。

webpack 4 的 production 模式下,默认会启用这个插件,并且向代码中注入了一个process.env.NODE_ENV的全局常量。

很多第三方的模块都是通过这个成员判断当前的运行环境,从而决定是否执行一些操作,例如:打印日志

DefinePlugin 插件接收一个对象,对象中的的key-value都会被注入到代码当中。

例如:

const webpack = require('webpack')
module.exports = {plugins: [new webpack.DefinePlugin({// 全局注入一个API地址API_BASE_URL: 'https://api.example.com',// value应是一个符合JS语法的代码片段// API_BASE_URL: '"https://api.example.com"'// API_BASE_URL: JSON.stringify('https://api.example.com')})]
}

打包时,就会将API_BASE_URL的值,**直接 **替换代码中的API_BASE_URL

开发时:console.log(API_BASE_URL)

打包后:console.log.(https://api.example.com)

由此可知,DefinePlugin定义的成员的值,实际上是一个符合JS语法的代码片段。

它会在打包时直接替换代码中的key。

所以API_BASE_URL配置的值可以改为'"https://api.example.com"'

小技巧:如果value为一个值,可以通过JSON.stringify()将其转换成一个表示这个值的代码片段。

DefinePlugin 插件可以用于针对不同的环境注入对应的全局成员。


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
author-avatar
彼岸花芬芳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有