【问题标题】:True ENV Values in Laravel MixLaravel Mix 中的真实 ENV 值
【发布时间】:2018-07-11 03:34:22
【问题描述】:

所以在 Laravel Mix 中,它在文档中说我们可以将内容添加到以 MIX_ 为前缀的 .env 文件中,然后我们可以在编译时在 JS 文件中访问它。

我想我可能在这里遗漏了一些东西,因为这并没有真正提供与 env 文件类似的任何东西,因为在将资产推送到服务器之前,它们会在本地编译成生产模式。这意味着 npm run watch 和 npm run build 都会获取相同的 env 值,对吧?

它作为一种全局变量工作,但不能作为环境变量,因为你不能根据环境设置值,

这似乎很明显,所以我假设我错过了什么??

【问题讨论】:

  • npm run build 任务可能有内置的覆盖,告诉它使用什么环境。这种事情在 CI 服务器上运行也很常见,它会放置适当的环境变量。
  • 那么,您的问题是什么?你说的对。部署后,所有 env 变量都将被生产值覆盖。无论您编译到 mix-s 中的任何内容都将保持其在 dev 中设置的方式。这似乎是个坏主意。

标签: laravel laravel-mix


【解决方案1】:

@Ohgodwhy 的回答有效,但需要对新的混合版本稍作修改

require('dotenv').config()
let webpack = require('webpack')

let dotenvplugin = new webpack.DefinePlugin({
    'process.env': {
        APP_NAME: JSON.stringify(process.env.APP_NAME || 'Default app name'),
        NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'development')
    }
})

mix.webpackConfig({
    ...
    plugins: [
        dotenvplugin,
    ]

【讨论】:

    【解决方案2】:

    这是我最终这样做的方式:

    任何从谷歌登陆这里的人都是我这样做的:

    env.js

    let globalEnv = {
      development: {
        embedScriptUrl: 'http://localjspath.js',
        embedCssUrl: 'http://localcsspath.css',
      },
     production: {
        embedScriptUrl: 'https://s3.us-east-2.amazonaws.com/pathtojs.js',
        embedCssUrl: 'https://s3.us-east-2.amazonaws.com/pathtocss.css',
      }
    };
    
    export default function env(property){
      return globalEnv[process.env.NODE_ENV][property];
    };
    

    然后,您只需在前端 JS 中导入并调用 env('embedScriptUrl'),就像在 laravel PHP 文件中一样

    【讨论】:

      【解决方案3】:

      你可以这样做:

      设置步骤:

      1. npm install dotenv --save
      2. webpack.mix.js 文件的顶部添加require('dotenv').config()
      3. 在#2 之后添加let webpack = require('webpack')

      现在您可以通过在 mix 声明中使用 DefinePlugin 将这些注入到您的构建中:

      mix.webpackConfig({
        //...
        new webpack.DefinePlugin({
          'process.env': {
            APP_NAME: JSON.stringify(process.env.APP_NAME || 'Default app name'),
            NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'development')
          }
        })
      })
      

      现在您的bundled 文件可以使用process.env.APP_NAME,例如,在应用程序中。这可以防止您将 .env 文件暴露给浏览器,但允许您通过整个堆栈轻松共享全局的、不安全的值。

      注意事项

      请注意,process.env 不会被 Laravel 的 .env 替换,而是通过合并将其公开。因此,例如,如果您将参数传递给npm/yarn run dev(例如NODE_ENV=development),则无需在.env 文件中声明NODE_ENV。如果你这样做了,.env 文件将会优先。

      【讨论】:

      • 感谢您的回答,我不明白的是如何告诉 webpack 在您执行 npm run watch 和 npm run build 时使用不同的 env 文件。这样,它总是只使用 .env 中的值,它总是本地的
      • @ChrisBell 需要在您的 webpack 文件中使用不同的 .env 文件,具体取决于您的 NODE_ENV 变量。
      • 是的,为 php 文件提供 .env 文件,为节点环境提供 .env.json 文件似乎是最干净的方法,但不知道如何在 laravel mix 中做到这一点查看文档
      • @ChrisBell 你会做if( mix.inProduction()) { } else { } 并根据你是否在生产中需要文件。你在你的scripts: 声明中传递NODE_ENV 在你的package.json 中,这样应该可以帮助你解决逻辑链。
      • 这不起作用或不再起作用(当我尝试它时),因为 Mix 运行它自己的插件(MixDefinitionsPlugin)——这会产生一个新的 DefinePlugin 实例——无论你定义什么,只用MIX_ 变量。花了一些时间试图为多环境的事情想出一个替代方案。记录在这里:stackoverflow.com/a/49940016/50158
      猜你喜欢
      • 2017-09-26
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2019-05-30
      • 2020-11-16
      • 2017-08-05
      • 2016-08-03
      相关资源
      最近更新 更多