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
})
]
};
如何根据不同环境,使用不同配置文件呢?
首先我们是可以利用给webapck指定配置文件来达到此目的,
比如:创建webpack.dev.js和webpack.config.js 。然后在script定义如下脚本
"scripts": {
"dev":"webpack --config webpack.dev.js",
"build":"webpack"
}
这样没问题,不过这样会有多个webpack配置文件,另外还有一种办法去做这样的事
利用了node的环境变量,然后webpack读取当前进程中的环境变量(webpack执行起来就是一个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项目中读取process,比如node-demo.js
console.log(process.env)
web读取process.env
webpack编译后的代码中拿到环境变量
webpack也是一个node项目进程,所以直接可以拿到webpack.config.js是可以直接process.env
然后通过webpack.DefinePlugin注入进来。如下配置webpack.config.js即可
const webpack = require('webpack');
const readEnv = require('./readEnv')
const customEnv = readEnv('./.env');
module.exports = {
plugins: [
new webpack.DefinePlugin({
process: {
env: JSON.stringify({
...process.env,
...customEnv
})
}
})]
};
如口文件 index.js
// 源代码
console.log('i am index',process.env.appName);
// 编译后的代码
console.log("i am index",'"测试app"');
动态设置环境变量
通过动态设置环境变量,可以根据不同的script,来加载不同的配置文件
通过编辑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
看看编译后的代码
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"
}
命令行可配置操作
进阶一下,可以不用看
如果我想通过命令行 指定配置文件,改怎么做,
方案:可以通过运行node程序,给这个node脚本指定参数,然后再node再去做复杂的逻辑
packge.json脚本如下
"scripts": {
"build": "node builder.js ./.env"
},
builder.js代码如下
const shell = require('shelljs');
const readEnv = require('./readEnv')
const customEnv = readEnv(process.argv.slice(2)[0]);
// 扩充process对象,将自定义的配置注入进去
process.env = {
...process.env,
...customEnv
}
// 执行webpack
shell.exec('webpack');
webapck.config.js
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.DefinePlugin({
process:{
...process.env
}
})
]
};
参考:
https://www.cnblogs.com/tugenhua0707/p/9780621.html
https://segmentfault.com/q/1010000009324489
webpack项目的全局变量的更多相关文章
- webpack 项目实战
步骤一: npm init 步骤二: npm install -D clean-webpack-plugin css-loader extract-text-webpack-plugin html-w ...
- 搭建自己的Webpack项目
五,搭建自己的Webpack项目 https://www.jianshu.com/p/42e11515c10f
- vue+webpack项目打包后背景图片加载不出来问题解决
在做VUE +的WebPack脚手架项目打包完成后,在IIS服务器上运行发现项目中的背景图片加载不出来检查项目代码发现是因为CSS文件中,背景图片引用的路径问题;后来通过修改配置文件,问题终于解决了, ...
- webpack项目在开发环境中使用静态css文件
webpack项目在开发环境中使用静态css文件 在webpack项目(本人使用的 vue-cli-webpack )中,需要引入 css 或 scss等样式文件时,本人目前知道的,通常有以下几种方法 ...
- (转)windows环境vue+webpack项目搭建
首先,vue.js是一种前端框架,一般利用vue创建项目是要搭配webpack项目构建工具的,而webpack在执行打包压缩的时候是依赖node.js的环境的,所以,要进行vue项目的开发,我们首先要 ...
- webpack项目调试以及独立打包配置文件
webpack项目调试 -sourcemap webpack配置提供了devtool这个选项,如果设置为 ‘#source-map’,则可以生成.map文件,在chrome浏览器中调试的时候可以显示源 ...
- 从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(一)
摘要:随着前端技术的飞速发展,越来越多的技术领域开始被前端工程师踏足.从NodeJs问世至今,各种前端工具脚手架.服务端框架层出不穷,“全栈工程师”对于前端开发者来说,再也不只是说说而已.在NodeJ ...
- 【原创】从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(二)
摘要:上篇文章说到了如何新建工程,并启动一个最简单的Electron应用.“跑起来”了Electron,那就接着把Vue“跑起来”吧.有一点需要说明的是,webpack是贯穿这个系列始终的,我也是本着 ...
- vue-cli安装webpack项目及初始配置
这个下载包是自己基于 webpack 搞的,可以看看https://github.com/chichengyu/webpack vue-cli安装 输入 npm install vue-cli -g ...
- vue+webpack项目环境搭建
首先安装node.js 下载地址:https://nodejs.org/en/download/ 看下是否成功安装 node -v 安装webpack,命令行npm install webpack - ...
随机推荐
- Altium designer21启动慢的解决方法
安装altium designer21,启动非常慢,卡在starting GUI manager步骤,经搜索确认是卡在了网络等待环节. 解决办法: 1.先等待进入软件. 2.进入后点击右上角的⚙齿轮图 ...
- Python科学计算系列9—逻辑代数
1.基本定理的验证 代码如下: from sympy import * A, B, C = symbols('A B C') # 重叠律 # A·A=A A+A=A print(to_cnf(A | ...
- Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提效!
前言 今天大姚带领大家一起来看看 Visual Studio 2022 v17.13 新版发布都更新了哪些新功能,为我们开发工作带来了哪些便利,是否真的值得我们花费时间把 Visual Studio ...
- eolinker同一个自动化用例内执行不同端接口遇到的问题(主要是两套host环境共存的问题)解决方法
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html eolinker内同一套环境只能配置一个host地址,如 ...
- 37.1K star!MCP爆火后,这个AI模型全能工具箱开源项目让智能体开发更简单!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "Awesome MCP Servers 是当前最全面的模型上下文协议服务器集合, ...
- 代码随想录第四天 | Leecode 24. 两两交换链表、19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交、 142.环形链表II
Leecode 24 两两交换链表 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 1: 输入:h ...
- Nacos源码—3.Nacos集群高可用分析
大纲 1.Nacos集群的几个问题 2.单节点对服务进行心跳健康检查和同步检查结果 3.集群新增服务实例时如何同步给其他节点 4.集群节点的健康状态变动时的数据同步 5.集群新增节点时如何同步已有服务 ...
- 怎么查看软件保存的密码(WIN11)
今天在用 Xshell 的时候,发现不记得密码了,虽然 Xshell 保存了密码,但是无法查看,都是星星,于是网上找了下,找到一篇文章,正好解决了我的困扰,里面有说明了实现原理,链接如下:https: ...
- WPF placeHolder效果的样式设定
<UserControl x:Class="wpfTestStudio.textPlaceHolderDemo" xmlns="http://schemas.mic ...
- L1-6、Prompt 与上下文的关系🤖
模型不是"记性差",只是"提示不清". 为什么理解上下文对话很重要? 大模型具备 "上下文窗口" 的能力,可以"记住"你 ...