基于webpack项目的全局变量

熟悉vue的同学,肯定知道有.env或env.development类似于这样的配置文件来定义app的全局变量。那么这是如何实现的呢?如果我没用vue,比如我用的react或者纯手工的webpack项目。我怎么去实现这个功能呢?以下详细描述,也是vue支持配置文件的原理。

如何向应用注入全局变量?

答案是,通过webpack.DefinePlugin
具体用法如下
webpack.config.js

const webpack = require('webpack');

module.exports = {
plugins: [
new webpack.DefinePlugin({
appName:"'测试app'",
version:1.0
})
]
};

index.js

console.log(appName);

如何像vue那样读取专属配置文件呢?

首先你需要定义这样的配置文件 .env

appName="测试app"

然后定义一个解析这样文件的方法 readEnv.js

const fs = require('fs');
const path = require('path'); // 读取环境变量的文件把它转化成对象
module.exports = (file) => { // flie为文件路径
let fileName = path.join(__dirname, file);
let data = fs.readFileSync(fileName, { encoding: 'utf8' })
let d = data.replace(/\r/g, ',').replace(/\n/g, '') // 把换行和回车替换
let arr = d.split(',').map(item => {
return item.split('=')
}) // [ [ 'a', '1' ], [ 'b', '2' ] ]
let obj = {}
arr.forEach(item => {
obj[item[0]] = item[1]
})
return obj //{ a: '1', b: '2' }
// 可以接着处理
/* 像vue-cli3 新版create-react-app 一样规定环境变量的Key必须以(VUE_APP_) (REACT_APP_) 开头 */
}

最后使用 webpack.config.js

const webpack = require('webpack');
const readEnv = require('./readEnv')
const env = readEnv('./.env'); module.exports = {
plugins: [
new webpack.DefinePlugin({
...env
})
]
};

如何根据不同环境,使用不同配置文件呢?

这里是利用了node的环境变量,所以需要了解下node和环境变量知识

环境变量

环境变量是什么呢?
其实我们可以把它理解为"系统的视线范围",
没错,配置进入了环境变量的程序,就等于是进入了系统的视线范围,
打开DOS命令窗口后输入程序名,
系统就会把在其视线内的环境变量内的程序找出来,
如果程序没有配置进入环境的变量的话,那系统自然就找不到。


window下查看环境变量:cmd>输入set回车,你就能看到类似于如下的打印,就是系统的环境变量了

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_221
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_221\bin;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;D:\soft\apache-maven-3.6.1\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;C:\Users\admin\AppData\Roaming\npm;C:\Users\admin\AppData\Local\Programs\Microsoft VS Code\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
...

查看某个具体的环境变量, set 环境变量名 ,比如 set JAVA_HOME 。会打印如下

C:\Users\admin>set JAVA_HOME
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_221

临时设置环境变量(重启会失效)

set JAVA_HOME=123

node与系统环境变量

node应用是如何读写当前操作系统的环境变量呢?
每一个node程序,都有一个当前程序的进程对象process。
这个对象里有一个属性env,即可读取当前操作系统的环境变量。
在node环境下,输入 process.env

C:\Users\admin>node
Welcome to Node.js v14.15.1.
Type ".help" for more information.
> process.env
{
JAVA_HOME: 'C:\\Program Files\\Java\\jdk1.8.0_221',
MVN_HOME: 'D:\\soft\\apache-maven-3.6.1',
OneDrive: 'C:\\Users\\admin\\OneDrive',
OS: 'Windows_NT',
Path: 'C:\\Program Files\\Java\\jdk1.8.0_221\\bin;C:\\Program Files\\Git\\cmd;C:\\Program Files\\nodejs\\;D:\\soft\\apache-maven-3.6.1\\bin;C:\\Users\\admin\\AppData\\Roaming\\npm;
}

node程序不能设置环境变量,只能读取

注入环境变量并编译

通过编辑packge.json的script,
我们可以在执行webpack编译前,
修改或添加本次webpack编译时(即本次node程序运行时)的环境变量
packge.json脚本如下:

"scripts": {
"dev": "set NODE_ENV=development && webpack",
"build": "set NODE_ENV=production && webpack"
}

新增两个配置文件
.env 和 .env.development。内容分别如下

appName="正式app"
appName="测试app"

核心代码如下webpack.config.js

const webpack = require('webpack');
const readEnv = require('./readEnv'); const isDev = process.env.NODE_ENV==='development';
const injectEnvDate = isDev?readEnv('./.env.development'):readEnv('./.env'); module.exports = {
plugins: [
new webpack.DefinePlugin({
...injectEnvDate
})
]
};

入口程序index.js

console.log(process.env.NODE_ENV+':'+appName);

测试验证
尝试运行编译测试 npm run dev
看看编译后的代码
```javascript
console.log("development:测试app");
```
已经生效

兼容性问题

当我们在mac或和linux上执行 npm run build或dev的时候会报错
因为linux上设置环境变量的语法和window不一样
window是 set JAVA_HOME=xxx
linux是JAVA_HOME=xxx
为了抹平这种差异,我们可以引用一个三方包,来处理

yarn add --dev cross-env

然后修改script命令

"scripts": {
"dev": "cross-env NODE_ENV=develop webpack", //注意这里没有&&
"build":"cross-env NODE_ENV=production webpack"
}

参考:
https://www.cnblogs.com/tugenhua0707/p/9780621.html
https://segmentfault.com/q/1010000009324489

基于webpack项目的全局变量的更多相关文章

  1. 基于webpack+react+antd 项目构建

    工欲善其事必先利其器,学习React也是如此. 下面分享一篇基于webpack+react+antd 项目构建的好文章, https://blog.hduzplus.xyz/articles/2017 ...

  2. 基于webpack的vue项目路径别名

    在vue的项目里,我们可以使用../这样的相对路径的方式引用不同目录的组件: import userinfo from '../../../components/userinfo.vue'; 使用.. ...

  3. 从零搭建基于webpack的Electron-Vue3项目(1)——基于webpack的Vue3项目搭建

    从零搭建基于webpack的Electron-Vue3项目(1)--基于webpack的Vue3项目搭建 前言 本篇文章内容,主要是基于webpack的Vue3项目开发环境进行搭建,暂时还不涉及到El ...

  4. Vue.js——60分钟webpack项目模板快速入门

    概述 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开发模板.webpack提供了和browserify ...

  5. 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)

    1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...

  6. boi剖析 - 基于webpack的css sprites实现方案

    本文是58到家前端工程化集成解决方案boi的博文系列之一.boi是基于webpack打造的一站式前端工程化解决方案,现已开源Github. 作为前端构建工具不可或缺的一个环节,自动生成css spri ...

  7. 基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    基于 Webpack & Vue & Vue-Router 的 SPA 初体验 本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com ...

  8. vue+webpack项目实战

    概述 -- 项目中会用到的插件 vue-router vue-resource 打包工具 webpack 依赖环境 node.js start 安装vue开发的模板 # 全局安装 vue-cli $ ...

  9. Vue.js中组件传参的方法 - 基于webpack模板

    在Vuejs中, 组件之间的传参是今天第一次接触, 之前写的组件互相之间都是独立的, 弗敢专也, 必以分人 环境: node.js npm vue-cli 以上安装请自行百度 一.项目创建 $ vue ...

  10. Vue + webpack 项目实践

    Vue.js 是一款极简的 mvvm 框架,如果让我用一个词来形容它,就是 “轻·巧” .如果用一句话来描述它,它能够集众多优秀逐流的前端框架之大成,但同时保持简单易用.废话不多说,来看几个例子: & ...

随机推荐

  1. 2024 (ICPC) Jiangxi Provincial Contest -- Official Contest

    L. Campus 1.首先考虑时间复杂度,因为最多只会有2*k的时间点,所以我们采取的策略是,对这每个时刻,判断有多少扇门是开的,并且考虑这些门到其他点的最短路之和. 2.输入完数据以后,使用dij ...

  2. STM8S003驱动TM1650偶发性故障

    故障现象:STM8S003驱动TM1650数码管显示,偶发TM1650无法初始化造成数码管点不亮. 已经在程序中对TM1650初始化之前加上了延时,但是问题并未改善. 之前发生过类似情况,STM8S0 ...

  3. Spring解决创建单例bean,而存在线程不安全问题,的解决方案

    一.线程安全问题都是由全局变量.静态变量和类的成员变量引起的.若每个线程中对全局变量.静态变量和类的成员变量只有读操作,而无写 操作,一般来说,这个全局变量是线程安全的,反之线程存在问题 二.因为Sp ...

  4. DPDI(Dispatch PDI)kettle调度管理平台介绍

    DPDI online产品简介 DPDI Online 是一款基于Kettle的强大在线任务调度平台,凭借其高效与灵活性,专为调度和监控Kettle客户端生成的ETL任务而设计 DPDI Online ...

  5. 【问题解决】centos7已经不维护了,如何继续使用yum源?

    背景 CentOS 7 已于2024年6月30日停止维护,在停止维护后我们之前配置的国内镜像源大多都是空目录了,即在线国内镜像源不可用,就像下边这样提示: [root@bogon yum.repos. ...

  6. <HarmonyOS第一课12>Web组件和WebView #鸿蒙课程##鸿蒙生态#

    课程介绍 <HarmonyOS第一课:Web组件和WebView>是一门专为HarmonyOS开发者设计的课程,旨在掌握如何在应用中集成Web内容.课程首先介绍了基于Web技术的Web组件 ...

  7. 【BUG】C语言|左移之后,最高位的数字还在吗?(整型提升)

    文章目录 问题概述 应用 怀旧 问题概述 这个错是刚学c语言的时候碰到的,突然好想我的c语言老师,所以在此记录一下. #include<stdio.h> void main(){ unsi ...

  8. 【经验】VMware|Win11的Ubuntu虚拟机启动虚拟化,报错此平台不支持虚拟化的 Intel VT-x/EPT(方案汇总+自己的解决方案)

    2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! 我开虚拟化是为了在虚拟机中运行VirtualBox,如果不 ...

  9. Java 数据库开发总结

    数据库连接.设计以及备份技巧集锦 JDBC操作各种数据库经验技巧集萃 Java 数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的  ...

  10. LinqHelper拓展

    public static class LinqHelper { //NHibernate.Hql.Ast.HqlBooleanExpression public static Expression& ...