实用webpack插件之DefinePlugin

webpack.DefinePlugin与cross-env区别详解 主要介绍了webpack.DefinePlugin与cross-env区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

在这里插入图片描述

通过阅读这篇文章,可以学习到如何使用DefinePlugin插件使得前端项目更加工程化,说清晰点就是如何使用这个插件,在编译阶段根据NODE_ENV自动切换配置文件,提升前端开发效率。

  • DefinePlugin的正确用法
  • 如何使用DefinePlugin添加配置文件,构建期间自动检测环境变化,也就是如何根据NODE_ENV引入配置文件?
DefinePlugin的正确用法

DefinePlugin中的每个键,是一个标识符或者通过.作为多个标识符。

  • 如果value是一个字符串,它将会被当做code片段
  • 如果value不是字符串,它将会被stringify(包括函数)
  • 如果value是一个对象,则所有key的定义方式相同。
  • 如果key有typeof前缀,它只是对typeof 调用定义的。

这些值将内联到代码中,压缩减少冗余。

new webpack.DefinePlugin({
    PRODUCTION: JSON.stringify(true),
    VERSION: JSON.stringify('5fa3b9'),
    BROWSER_SUPPORTS_HTML5: true,
    TWO: '1+1',
    'typeof window': JSON.stringify('object'),
    'process.env': {
         NODE_ENV: JSON.stringify(process.env.NODE_ENV)
     }
});
console.log('Running App version' + VERSION);

plugin不是直接的文本值替换,它的值在字符串内部必须包括实际引用。典型的情况是用双引号或者JSON.stringify()进行引用,’“production”’,JSON.stringify(‘production’)。

重点:在vue-cli创建的项目中,凡是src下的文件,都可以访问到VERSION这个变量,例如main.js,App.vue等等

我们现在看一下上面的几种类型的key值,在代码中的输出。

console.log(PRODUCTION, VERSION, BROWSER_SUPPORTS_HTML5, TWO, typeof window, process.env);
PRODUCTION: true,
VERSION: "5fa3b9",
BROWSER_SUPPORTS_HTML5: true,
TWO: 2,
typeof window: "object",
process.env: {NODE_ENV: "development"},

在代码中,我们一般会有以下几种用途:

  • 根据process.env.NODE_ENV区分环境
  • 引入配置文件
  • 根据NODE_ENV引入配置文件(这个很重要,后面会讲到)
Feature Flag

可以控制新特性和实验特性的开关。

new webpack.DefinePlugin({
    'NICE_FEATURE': JSON.stringify(true),
    'EXPERIMENTAL': JSON.stringify(false),
})
process.env.NODE_ENV的正确配置方式是什么?
process: {
    env: {
        NODE_ENV: JSON.stringify('production')
    }
}

评价:非常不好,会overwrite整个process对象,仅仅保留新的NODE_ENV,破坏进程。
原始的process对象包含如下内容 ,包含了当前进程的很多信息。

process {
  title: 'node',
  version: 'v8.11.2',
  moduleLoadList: 
   [ 'Binding contextify',],
  versions: 
   { http_parser: '2.8.0'},
  arch: 'x64',
  platform: 'darwin',
  release: 
   { name: 'node' },
  argv: [ '/usr/local/bin/node' ],
  execArgv: [],
  env: 
   { TERM: 'xterm-256color'},
  pid: 14027,
  features: 
   { debug: false},
  ppid: 14020,
  execPath: '/usr/local/bin/node',
  debugPort: 9229,
  _startProfilerIdleNotifier: [Function: _startProfilerIdleNotifier],
  _stopProfilerIdleNotifier: [Function: _stopProfilerIdleNotifier],
  _getActiveRequests: [Function: _getActiveRequests],
  _getActiveHandles: [Function: _getActiveHandles],
  reallyExit: [Function: reallyExit],
  abort: [Function: abort],
  chdir: [Function: chdir],
  cwd: [Function: cwd],
  umask: [Function: umask],
  getuid: [Function: getuid],
  geteuid: [Function: geteuid],
  setuid: [Function: setuid],
  seteuid: [Function: seteuid],
  setgid: [Function: setgid],
  setegid: [Function: setegid],
  getgid: [Function: getgid],
  getegid: [Function: getegid],
  getgroups: [Function: getgroups],
  setgroups: [Function: setgroups],
  initgroups: [Function: initgroups],
  _kill: [Function: _kill],
  _debugProcess: [Function: _debugProcess],
  _debugPause: [Function: _debugPause],
  _debugEnd: [Function: _debugEnd],
  hrtime: [Function: hrtime],
  cpuUsage: [Function: cpuUsage],
  dlopen: [Function: dlopen],
  uptime: [Function: uptime],
  memoryUsage: [Function: memoryUsage],
  binding: [Function: binding],
  _linkedBinding: [Function: _linkedBinding],
  _events: 
   { newListener: [Function],
     removeListener: [Function],
     warning: [Function],
     SIGWINCH: [ [Function], [Function] ] },
  _rawDebug: [Function],
  _eventsCount: 4,
  domain: [Getter/Setter],
  _maxListeners: undefined,
  _fatalException: [Function],
  _exiting: false,
  assert: [Function],
  config: {},
  emitWarning: [Function],
  nextTick: [Function: nextTick],
  _tickCallback: [Function: _tickDomainCallback],
  _tickDomainCallback: [Function: _tickDomainCallback],
  stdout: [Getter],
  stderr: [Getter],
  stdin: [Getter],
  openStdin: [Function],
  exit: [Function],
  kill: [Function],
  _immediateCallback: [Function: processImmediate],
  argv0: 'node' }
'process.env': {
    NODE_ENV: JSON.stringify('production')
}

评价:不好,会overwrite整个process.env对象,破坏进程环境,导致破坏兼容性。
原始的process.env对象包含如下内容 ,包含了当前进程的很多信息。

{ TERM: 'xterm-256color',
  SHELL: '/bin/bash',
  TMPDIR: '/var/folders/lw/rl5nyyrn4lb0rrpspv4szc3c0000gn/T/',
  Apple_PubSub_Socket_Render: '/private/tmp/com.apple.launchd.dEPuHtiDsx/Render',
  USER: 'frank',
  SSH_AUTH_SOCK: '/private/tmp/com.apple.launchd.MRVOOE7lpI/Listeners',
  __CF_USER_TEXT_ENCODING: '0x1F5:0x19:0x34',
  PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS',
  PWD: '/Users/frank/Desktop/corporation/weidian-crm',
  XPC_FLAGS: '0x0',
  XPC_SERVICE_NAME: '0',
  SHLVL: '1',
  HOME: '/Users/frank',
  LOGNAME: 'frank',
  LC_CTYPE: 'zh_CN.UTF-8',
  _: '/usr/local/bin/node' }
'process.env.NODE_ENV': JSON.stringify('production')

评价:好。因为仅仅对NODE_ENV值进行修改,不会破坏完整进程,也不会破坏兼容性。

如何使用DefinePlugin添加配置文件,构建期间自动检测环境变化,也就是如何根据NODE_ENV引入配置文件?

情景:开发阶段的接口地址往往与生产阶段的接口地址是不一致的。例如开发时是development.foo.com,而生产时是production.foo.com,如果需要打包发布,那么需要手动去替换域名或者是一个分支维护一个专门的配置文件,这两种方式是非常笨重的。

  • 手动替换
    文件效率低下,每次在development和production见切换都需要进行配置文件的更新,容易出错
  • 配置文件
    相对手动替换高级一些,但是不能一次性查看development和production的全部配置信息,需要在分支间切换,效率低下,且不适用于多种环境的配置
  • webpack.DefinePlugin()
    全局配置文件,自动检测环境变化,效率高效。

webpack的DefinePlugin正是为我们解决这样一个问题,它维护一个全局的配置文件,在编译期间会自动检测process.env.NODE_ENV,根据当前的环境变量去替换我们的接口域名。

下面我将以一个实例来介绍如何正确使用webpack.DefinePlugin。

/config/api.js

const NODE_ENV = process.env.NODE_ENV;
const config = {
     production: {
        FOO_API: 'production.foo.api.com',
        BAR_API: 'production.bar.api.com',
        BAZ_API: 'production.baz.api.com',
     },
     development: {
        FOO_API: 'development.foo.api.com',
        BAR_API: 'development.bar.api.com',
        BAZ_API: 'development.baz.api.com',
     },
     test: {
        FOO_API: 'test.foo.api.com',
        BAR_API: 'test.bar.api.com',
        BAZ_API: 'test.baz.api.com',
     }
}
module.exports = config[NODE_ENV];

webpack.dev.conf.js/webpack.prod.conf.js/webpack.test.conf.js

const apiConfig = require('./config/api');
const webpackConfig = {
    plugins: [
        new webpack.DefinePlugin({
            API_CONFIG: JSON.stringify(apiConfig);
        })
    ]
}
...

custom.component.vue

<template>
...
</template>
<script>
// 这里也可以访问到API_CONFIG
export default {
    // 这里无论是data函数,methods对象,computed对象,watch对象,都可以访问到API_CONFIG;
   data() {
       return {
           fooApi: API_CONFIG.FOO_API,
           user:{
               id: '',
               name: '',
           },
           hash: '',
        } 
    },
    computed: {
        userAvator() {
            return `${API_CONFIG.BAR_API}?id=${user.id}&name=${user.name}`
        }
    },
    methods: {
        uploadImage() {
            api.uploadImage({user: `${API_CONFIG.BAZ}\${hash}`})
                 .then(()=>{})
                 .catch(()=>{})
        }
    }
}
</script>

上述仅仅适用于vue-cli2.0时代,vue-cli3.0引入了webpack-chain,配置方式大大不同,下文将给出示例。

如何在vue.config.js中,使用使用DefinePlugin添加配置文件,构建期间自动检测环境变化,也就是如何根据NODE_ENV引入配置文件?

vue.config.js

const apiConfig = require('./config/api');

module.exports = {
    chainWebpack: config => {
        config
            .plugin('define')
            .tap(args => { 
                args[0].API_CONFIG = JSON.stringify(apiConfig)
                return args
            })
    }
}

需要注意的是,在vue-cli3.0中,我们不能直接SET NODE_ENV=production或者EXPORT NODE_ENV=production。
因为vue-cli-servive有3种模式,serve默认为development,build为production,若想修改vue-cli-service包中的NODE_ENV,需要通过vue-cli-service serve --mode production进行切换。
就像下面这样:

{
  "scripts": {
    "dev": "vue-cli-service serve", // mode默认为development 
    "production": "vue-cli-service serve --mode production", 
  },
}

注意:我们只能在development, production或者test 3个模式下进行切换,不能引入类似preproduction之类的自定义node环境,但是实际上这3个环境已经足以满足大多数的开发情况。

为什么vue-cli 3.0中的DefinePlugin可以用config.plugin(‘define’)修改入参?

在源码文件base.js中,有下面的代码:

    webpackConfig
      .plugin('define')
        .use(require('webpack/lib/DefinePlugin'), [
          resolveClientEnv(options)
        ])

这一点很关键!我们在vue.config.js中拿到的config.plugin(‘define’),实际上时vue-service内部创建的webpack.DefinePlugin实例的引用 !
明确了这一点,我们在以后增强webpack默认插件配置时,需要先到vue-service的源码中寻找一番,看看有没有对应plugin的引用,若有,必须根据vue-service定义的名字直接引用,否则会修改失败。

期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

努力成为优秀前端工程师!

BLDC方波控制 vs. FOC:技术选型指南与未来演进 本文深入对比BLDC电机方波控制与FOC技术的核心差异,分析两者在成本、性能和应用场景上的权衡。方波控制凭借低成本和易实现性,在电动工具和家电领域优势明显;而FOC则以平滑高效控制见长,适用于高端精密应用。文章为工程师提供了实用的技术选型指南,并展望了未来技术融合的发展趋势。 阅读详情

相关推荐

保姆级教程:用STM32CubeMX HAL库搞定ESP8266连接,附串口printf调试全流程

本文提供了一份详细的STM32CubeMX HAL库教程,指导开发者如何实现ESP8266无线模块的连接与调试。从开发环境搭建、串口配置到AT指令通信解析,涵盖了物联网开发中的关键步骤和常见问题解决方案,帮助开发者快速掌握STM32与ESP8266的集成技术。

weixin_28273593的博客 504

webpack DefinePlugin解析

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

郊眠寺 3364

反激电源占空比为何必须小于0.5?次谐波振荡与斜坡补偿详解

在开关电源设计中,峰值电流模式控制因其优异的动态响应和逐周期限流保护而被广泛应用。其工作原理是通过采样电感电流的峰值,与误差电压比较来控制开关管的导通与关断。然而,这种控制方式在反激等隔离拓扑中,当占空比超过50%时,会面临一个固有的稳定性挑战——次谐波振荡。这是由于电流扰动会在相邻开关周期内被放大而非衰减,导致系统在开关频率一半处发生振荡,严重影响输出纹波和可靠性。为解决这一问题,工程上引入了斜坡补偿技术,通过向控制信号叠加一个固定斜率的斜坡,改变环路增益条件,从而在宽输入电压或高占空比需求下维持系统稳定

weixin_29631169的博客 625

DefinePlugin插件

一、先来看看在Webpack的官方定义: DefinePlugin DefinePlugin允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和生产模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是DefinePlugin的用处,设置它,就可以忘记开发环境和生产环境构建的规则。 new webpac...

微差的博客 8633

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

学习笔记——神经科学的数学基础

m%3D2X_%7Bi%7DiNy%3DAxW%3DABx_%7Bj%7Dy_%7Bi%7Dy%3DWxt=N7T8卷积神经网络(CNN)详细介绍及其原理详解_IronmanJay的博客-优快云博客https://blog.csdn.net/IronmanJay/article/details/128689946?

zxyopenstar的博客 1374

defineplugin webpack_webpack DefinePlugin

DefinePlugin 允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和发布模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是 DefinePlugin 的用处,设置它,就可以忘记开发和发布构建的规则。new webpack.DefinePlugin({// Definitions...})用法每个传进 De...

weixin_28914903的博客 452

WRF-BEM相关参数说明

本参数适用于WRF-BEM模拟武汉市气候。

m0_60013472的博客 1896

Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量

DefinePlugin是Webpack生态系统中的核心插件,内置于Webpack本身。该插件允许在编译时创建全局常量,这些常量可以在源代码中直接使用。本质上,DefinePlugin执行的是一种"查找和替换"的操作,在编译阶段将代码中的变量替换为指定的值。关键在于,这种替换是在编译时完成的,而非运行时,这带来了显著的性能优势。通过合理使用DefinePlugin,可以实现代码的环境适应性、提高性能并简化配置管理流程,为现代前端工程化提供有力支持。

Dontla的博客 1647

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

YOLO26优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

高层筛选特征金字塔网络(HS-FPN),能够刷选出大小目标,增强模型表达不同尺度特征的能力,助力小目标检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 331

精心整理Webpack7分钟极速回忆录

style-loader css-loader file-loader url-loader less-loader vue-loaer postcss-loader iconfont CleanWebpackPlugin 删除打包文件夹 HtmlWebpackPlugin 指定HTML文件模板 DefinePlugin 定义全局常量 CopyWebapckPlugin 复制文件夹到打包目录

欢迎访问我的主页:https://www.bookbook.cc 2506

如何将 Fiori Elements Object Page Header 工具栏里按钮用 JavaScript 代码设置成禁用状态

本文介绍了如何在SAP Fiori Elements应用中动态控制Object Page工具栏按钮的可用状态。通过UI5 Inspector工具分析发现,这些按钮的enabled属性都双向绑定到/ui/enabled模型字段。在StatusExt.controller.js中,通过获取按钮ID前缀拼接完整控件ID,使用setEnabled(false)方法即可禁用按钮。关键点包括:1)使用extensionAPI获取视图ID前缀;2)注意事件回调中的this上下文绑定;3)通过修改模型字段可同步更新所有绑定

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

webpack常用插件(loader/plugin)和内置插件

clean-webpack-plugin 清除打包生成的目录 html-webpack-plugin 自动生成Html 常用配置 template: “相对路径 ./public/index.html” chunks: “all”, //默认值all 接收 [“home”] home是chunk名称,接收多个 filename: “”, //文件名 生成多个html,就在plugin中多次new HtmlWebpackPlugin() copy-webpack-plugin 复制文件到出口文件夹

yuey0809的博客 764

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

如何写出能过 ATS 筛选的简历:freehire CV 构建器 + Typst PDF 模板完整教程

ATS(Applicant Tracking System,申请人跟踪系统)决定了你 80% 以上的投递能否被看到,而大多数简历死在"机器读不懂"这一步。freehire 是开源的求职搜索引擎,内置了一套 **CV 构建器**:你把经历填进结构化文档,服务端用 [Typst](https://typst.community/) 把它渲染成**纯文本层的 ATS 友好 PDF**,并附带一份 0–1

gitblog_00015的博客 573

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

蓝易云 - ReactJS代码示例: 文件方式配置及环境变量的使用。

另外,如果你需要在运行时动态地设置环境变量,那么可以使用Webpack的DefinePlugin插件。在ReactJS中,我们经常需要使用环境变量来配置应用程序。总结一下,在ReactJS中使用文件方式来设置和获取环境变量是非常方便和实用的。如果有不同的开发和生产配置,则可能需要为每个配置创建一个单独的。文件,并在其中添加相应的键值对即可。这样,你就可以根据不同的环境来配置你的应用程序了。, 等等 文件,并根据当前运行模式加载相应文件。文件,并根据当前运行模式加载相应文件。然后,在你的代码中就可以通过。

高性价比服务器就选:蓝易云 360

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

webpack插件总结之DefinePlugin,ProvidePlugin

DefinePlugin 通过DefinePlugin可以定义一些全局的变量,我们可以在模块当中直接使用这些变量。无需作任何声明,看一个简单的webpack配置: const webpack = require('webpack') const path = require('path') module.exports = { entry: { main: './src/main.js' ...

qq_29055201的博客 2813

6. webpack.DefinePlugin插件学习

文章目录DefinePlugin 介绍使用场景例子使用规则定义字符串的解决办法定义全局变量测试js 代码结果 DefinePlugin 介绍 DefinePlugin 允许创建一个在编译时可以配置的全局常量。 注意:定义在全局有用,并不是说变量是在window下面 使用场景例子 对开发环境和生产环境使用不同的配置非常有用。如在开发环境中输出日志,在生产环境中不输出日志。这就是 DefinePlug...

黄彪博客 1007

认识Webpack插件Plugin;CleanWebpackPlugin插件;HtmlWebpackPlugin;DefinePlugin;Mode模式

认识Webpack插件Plugin;CleanWebpackPlugin插件;HtmlWebpackPlugin;DefinePlugin;Mode模式

qq_54075517的博客 1023

defineplugin webpack_webpack的内置插件

所有的webpack内置插件都作为webpack的静态属性存在的,使用下面的方式即可创建一个插件对象。const webpack = require("webpack") new webpack.插件名(options) DefinePlugin全局常量定义插件,使用该插件通常定义一些常量值,例如:new webpack.DefinePlugin({ PI: `Math.PI`, // ...

weixin_29843603的博客 261

Webpack DefinePlugin使用

Webpack DefinePlugin使用DefinePlugin DefinePlugin new webpack.DefinePlugin(definitions) DefinePlugin可以在编译时期创建全局变量。 该特性适用于开发版本同线上版本在某些常量上有区别的场景。 比如,可能会通过全局变量定义是否需要打印日志,在开发版中打印日志, 而在先上版本不打印日志。 new webpac...

shenzhen_zsw的专栏 1418

webpack.DefinePlugin使用介绍

这个插件是用来定义全局变量的 //webpack.config.js var webpack = require('webpack'); var path = require('path'); module.exports = { entry: { index: "./js/index.js" }, output: { path: "./d...

Jq的博客 1万+

defineplugin webpack_webpack插件总结之DefinePlugin,ProvidePlugin

DefinePlugin通过DefinePlugin可以定义一些全局的变量,我们可以在模块当中直接使用这些变量。无需作任何声明,看一个简单的webpack配置:const webpack = require('webpack')const path = require('path')module.exports = {entry: {main: './src/main.js'},output: {...

weixin_39926613的博客 343

webpack的DefinePlugin插件

DefinePlugin插件是用来定义全局变量的 //webpack.config.js var webpack = require('webpack'); var path = require('path'); module.exports = { entry: { index: "./js/index.js" }, output: { path: "./dist/", filename: "js/[name].js", ...

weixin_42329676的博客 955

defineplugin webpack_16、webpack 根据DefinePlugin插件创建不同环境文件

根据DefinePlugin插件创建生产和开发环境配置:1、安装插件(合并插件)yarn add webpack-merge -D2、build/webpack.base.config.js// 开发和生成模式共同的配置let path = require('path');// path.resolve 相对路径转成绝对路径// console.log(path.resolve('dist'));...

weixin_39822443的博客 272
上一篇: 如何理解vue中的v-model?
下一篇: 如何解决0.1 +0.2===0.30000000000000004类问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趁你还年轻233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值