You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Webpack传递变量至PHP?尝试DefinePlugin未生效

能否从Webpack向PHP传递变量?

首先明确:Webpack的DefinePlugin无法直接给PHP传递变量。因为DefinePlugin的作用是在前端代码构建阶段,替换JS代码中的指定变量(比如把JS里的TESTING_A_VAR替换成你定义的字符串),它只作用于前端JS代码,和后端PHP的运行环境完全隔离,PHP无法读取通过这个插件定义的变量。

你要传递开发/生产模式这类变量,需要通过「跨环境共享文件」或者「构建时生成配置文件」的方式实现,以下是两种可行方案:

方案一:构建时生成PHP配置文件

在Webpack构建过程中,直接生成一个包含变量的PHP文件,PHP代码通过引入这个文件来获取变量。

修改webpack.config.js

const path = require('path');
const webpack = require('webpack');
const fs = require('fs');

// 确定当前环境模式(可通过npm脚本传递,比如"build": "NODE_ENV=production webpack")
const isProduction = process.env.NODE_ENV === 'production';

// 生成PHP配置文件内容
const phpConfig = `<?php
define('WEBPACK_ENV', '${isProduction ? 'production' : 'development'}');
define('TESTING_A_VAR', 'My Value');
?>`;

// 写入到项目目录下的webpack-config.php文件
fs.writeFileSync(path.resolve(__dirname, 'webpack-config.php'), phpConfig);

module.exports = {
  entry: {
    main: ['./src/index.js'],
  },
  output: {
    path: path.resolve(__dirname, 'assets'),
    publicPath: '/assets/', // 根据你的实际路径调整
    filename: '[name].js',
  },
  plugins: [
    // 这个DefinePlugin是给前端JS用的,和PHP无关
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(isProduction ? 'production' : 'development'),
    })
  ],
};

在PHP中使用变量

<?php
// 引入Webpack生成的配置文件
require_once __DIR__ . '/webpack-config.php';

// 读取变量
var_dump(WEBPACK_ENV); // 输出 'production' 或 'development'
var_dump(TESTING_A_VAR); // 输出 'My Value'
?>

方案二:共享.env环境变量文件

通过.env文件统一管理变量,Webpack和PHP分别读取这个文件的内容,实现变量共享。

创建.env文件

NODE_ENV=development
TESTING_A_VAR=My Value

Webpack读取.env

需要安装dotenv包:npm install dotenv --save-dev

修改webpack.config.js:

const path = require('path');
const webpack = require('webpack');
const dotenv = require('dotenv');

// 加载.env文件内容
dotenv.config();

module.exports = {
  entry: {
    main: ['./src/index.js'],
  },
  output: {
    path: path.resolve(__dirname, 'assets'),
    publicPath: '/assets/',
    filename: '[name].js',
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
    })
  ],
};

PHP读取.env

可以使用原生PHP的getenv函数,或者更规范的vlucas/phpdotenv库:

原生PHP方式

<?php
$testingVar = getenv('TESTING_A_VAR');
$envMode = getenv('NODE_ENV');

var_dump($testingVar); // 输出 'My Value'
var_dump($envMode); // 输出 'development' 或 'production'
?>

使用phpdotenv库(推荐)

  1. 安装库:composer require vlucas/phpdotenv
  2. PHP代码:
<?php
require __DIR__ . '/vendor/autoload.php';

// 加载.env文件
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// 读取变量
var_dump($_ENV['TESTING_A_VAR']);
var_dump($_ENV['NODE_ENV']);
?>

内容的提问来源于stack exchange,提问作者hubvill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:15:10