webpack 配置 process.env 获取命令行参数

本文介绍如何利用webpack从命令行获取参数,实现在前端开发中根据不同环境设置不同服务器地址的需求。通过设置自定义参数http_env,修改webpack配置文件、package.json的scripts及服务器地址配置文件,实现灵活的环境切换。

前端开发工作中可能会遇到这样的需求:本地开发、测试环境、客户的线上环境等对应的服务器地址不一样,例如本地localhost开发、打包到测试环境要换成192开头的地址、打包到线上环境要带https的地址,这个时候如果直接去改配置服务器地址的文件,那就需要改一个打包一次,很麻烦,最好是能通过 npm run xxx 的形式实现。

实现方式分为4个步骤:

  1. 确定 webpack 从命令行获取的参数名称 ,这里我定为 http_env。刚开始我是定为NODE_ENV,但是新版本的 webpack 打包的时候会根据 mode 选项来设置NODE_ENV,所以最好是定一个跟 NODE_ENV 不一样的参数名称。
  2. 修改 webpack 配置文件中的 plugins 选项 ,代码:
    plugins: [
     new webpack.DefinePlugin({
        'process.env': {
            'http_env': JSON.stringify(process.env.http_env)
        }
     })
    ]
    
  3. 修改 package.json 配置文件中的 scripts 选项,代码:
    "build": "cross-env http_env=production webpack --config ./build/webpack.prod.config.js",
    "start": "cross-env http_env=development webpack-dev-server --config ./build/webpack.dev.config.js",
    "hk": "cross-env http_env=hk webpack --config ./build/webpack.prod.config.js"
    
  4. 修改 配置服务器地址的文件, 代码:
    const ENV = process.env.http_env
    
    var apiAddr = 'http://192.168.1.201:8080/'
    var wsAddr = 'ws://192.168.1.201:8080/'
    
    if(ENV === 'production') {
     apiAddr = 'http://192.168.1.201/'
     wsAddr = 'ws://192.168.1.201/'
    } else if(ENV === 'hk') {
       apiAddr = 'https://test.hk'
     wsAddr = 'wss://test.hk'
    }
    
    export {
     apiAddr,
     wsAddr
    }
    
在使用 `npm build` 时,如果无法通过 `process.env` 获取参数,主要原因可能包括以下几点: 1. **参数未正确注入环境变量**:`process.env` 是 Node.js 中用于访问环境变量的接口,如果在执行 `npm build` 时没有正确将参数注入到环境中,`process.env` 将无法获取到这些参数。例如,直接在命令行中传递的参数需要通过特定方式(如 `cross-env` 或其他环境变量管理工具)显式地设置到环境中[^3]。 2. **构建工具的限制**:某些构建工具(如 Webpack 或 Vue CLI)会根据 `--mode` 参数加载特定的 `.env` 文件,并将其中定义的变量注入到 `process.env` 中。然而,这些工具仅会加载符合命名规则的变量(例如以 `VUE_APP_` 开头的变量),如果自定义变量不符合这些规则,它们将不会被注入到 `process.env` 中[^2]。 3. **作用域问题**:`process.env` 的作用域是全局的,但如果在构建过程中使用了子进程或隔离的环境(如 Docker 容器),父进程设置的环境变量可能不会传递到子进程中,导致 `process.env` 无法获取到预期的参数。 4. **参数传递方式错误**:在某些情况下,参数可能没有通过正确的方式传递给 `npm build` 命令。例如,在 `package.json` 的 `scripts` 中定义命令时,需要确保参数在 `--` 之后传递,否则它们可能不会被正确解析为命令行参数。例如,正确的用法应为: ```json "scripts": { "build": "webpack --mode production" } ``` 如果需要传递自定义参数,应使用 `--` 显式分隔,例如: ```json "scripts": { "build": "webpack --mode production -- --custom-param=value" } ``` 然后通过 `process.argv` 获取这些参数,而不是依赖 `process.env`[^1]。 5. **环境变量的优先级问题**:某些构建工具会优先读取 `.env` 文件中的变量,并覆盖命令行中传递的同名变量。如果在 `.env` 文件中定义了与命令行参数同名的变量,可能会导致 `process.env` 获取到的是 `.env` 文件中的值,而不是预期的命令行参数值。 6. **Node.js 的 `process.env` 行为限制**:`process.env` 仅能访问环境变量,而不能直接访问命令行参数。如果需要获取命令行参数,应使用 `process.argv` 显式解析参数列表。例如: ```javascript const args = process.argv.slice(2); console.log(args); ``` 通过这种方式可以获取所有命令行参数,而不需要依赖 `process.env`。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值