如何从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库(推荐)
- 安装库:
composer require vlucas/phpdotenv - 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
相关产品推荐
相关产品推荐

