【问题标题】:Vue cli 3 display info from the package.jsonVue cli 3 显示来自 package.json 的信息
【发布时间】:2019-04-17 20:35:51
【问题描述】:

在一个 vue cli 3 项目中,我想在网页中显示一个版本号。版本号位于package.json 文件中。

我发现is this link in the vue forum的唯一参考。

但是,我无法让建议的解决方案发挥作用。

我尝试过的事情

  1. 在链接资源中使用webpack.definePlugin

vue.config.js

const webpack = require('webpack');

module.exports = {
  lintOnSave: true,

  configureWebpack: config => {
    return {
      plugins: [
        new webpack.DefinePlugin({
          'process.env': {
            VERSION: require('./package.json').version,
          }
        })
      ]
    }
  },
}

然后在main.ts 我读到process.env,但它不包含 VERSION(我尝试了几种变体,比如在链接页面中生成 PACKAGE_JSON 字段,并生成像 'foo' 这样的普通值而不是读取来自package-json)。它从来没有用过,就像代码被忽略了一样。我猜process.env 稍后会被 vue webpack 的东西重新定义。

process 登录 main.ts 但包含 process 通常包含在 vue-cli 项目中的所有内容,例如在 .env 文件中定义的模式和 VUE_APP 变量。

  1. 尝试在configure webpack函数上写信给process

喜欢:

 configureWebpack: config => {
   process.VERSION = require('./package.json').version
 },

(老实说,我对此并没有太大希望,但不得不尝试)。

  1. 尝试了链接页面中提出的其他解决方案,

喜欢:

// vue.config.js
module.exports = {
  chainWebpack: config => {
    config.plugin('define').tap( ([options = {}]) => {
      return [{
        ...options, // these are the env variables from your .env file, if any arr defined
        VERSION: JSON.stringify(require('./package.json').version)
      }]
    })
  }
} 

但这也默默地失败了。

  1. 使用@Oluwafemi 建议的config.plugin('define') 语法,

喜欢:

chainWebpack: (config) => {
  return config.plugin('define').tap(
    args => merge(args, [VERSION])
  )
},

其中VERSION 是一个局部变量,定义为:

const pkgVersion = require('./package.json').version;

const VERSION = {
  'process.env': {
    VUE_APP_VERSION: JSON.stringify(pkgVersion)
  }
}

但这也不起作用。


我每次都在重新启动整个项目,所以这不是流程内容不显示的原因。

我的 vue-cli 版本是 3.0.1

【问题讨论】:

  • 你试过process.VERSION = JSON.parse(require('./package.json')).version吗?
  • 是的,也试过了。但是 VERSION 无论如何都不会出现在进程中。

标签: javascript vue.js webpack vuejs2 vue-cli-3


【解决方案1】:

我正在添加我的 2 美分,因为我发现了一个更短的方式,显然是正确的方式 (https://docs.npmjs.com/misc/scripts#packagejson-vars)

在导出之前将其添加到您的 vue.config.file 中,而不是在里面:

process.env.VUE_APP_VERSION = process.env.npm_package_version

瞧!

然后您可以通过 process.env.VUE_APP_VERSION 从组件中使用它

【讨论】:

  • 这个。谢谢!超级好用!保持安全
  • 为什么不在组件中直接使用process.env.npm_package_version
  • 这个变量似乎不能直接在组件中使用。你可以在这里阅读更多:cli.vuejs.org/guide/…
【解决方案2】:

TLDR

vue.config.js 文件中的以下 sn-p 可以解决问题,并允许您以 APPLICATION_VERSION 访问应用程序的版本:

module.exports = {
  configureWebpack: config => {
    return {
      plugins: [
        new webpack.DefinePlugin({
          'APPLICATION_VERSION': JSON.stringify(require('./package.json').version),
        })
      ]
    }
  },
}

提示:

甚至不要尝试通过webpack.definePluginprocess.env 添加一些密钥:它不会像您预期的那样工作。

 为什么我之前的努力没有奏效

最后,我通过webpack.DefinePlugin 解决了这个问题。我遇到的主要问题是我找到的原始解决方案是使用definePlugin 写入process.env.PACKAGE_JSON 变量。

这表明definePlugin 以某种方式允许将变量添加到processprocess.env,但事实并非如此。每当我在控制台中记录process.env 时,我都没有找到我试图推入process.env 的变量:所以我认为definePlugin 技术不起作用。

实际上,webpack.definePlugin 所做的是在编译时检查字符串并将它们更改为代码中的值。因此,如果您通过以下方式定义 ACME_VERSION 变量:

module.exports = {
  lintOnSave: true,

  configureWebpack: config => {
    return {
      plugins: [
        new webpack.DefinePlugin({
          'ACME_VERSION': 111,
        })
      ]
    }
  },
}

然后,在main.js 中打印console.log(ACME_VERSION),您将得到111 正确记录

然而,这只是编译时的字符串更改。如果您尝试定义 process.env.VUE_APP_ACME_VERSION 而不是 ACME_VERSION...

当您登录process.env 时,VUE_APP_ACME_VERSION 键不会出现在对象中。 但是,原始的console.log('process.env.VUE_APP_ACME_VERSION') 将按预期生成111

因此,基本上,原始链接和建议的解决方案在某种程度上是正确的。然而,process 对象并没有真正添加任何内容。我在最初的尝试中记录了proccess.env,所以我没有看到任何工作。

然而,现在,由于 process 对象没有被修改,我强烈建议任何试图在编译时将变量加载到他们的 vue 应用程序的人不要使用它。充其量是误导。

【讨论】:

    【解决方案3】:

    在构建 Vue 应用程序时,environment variables that don't begin with the VUE_APP_ prefix are filtered outNODE_ENVBASE_URL 环境变量是例外。

    上述信息适用于在构建 Vue 应用程序之前设置环境变量的情况,而不适用于这种情况。

    在构建过程中设置环境变量的情况下,查看Vue CLI 在做什么很重要。

    Vue CLIuses webpack.DefinePlugin 使用从对resolveClientEnv 的调用返回的对象设置环境变量。

    resolveClientEnv 返回

    {
       'process.env': {}
    }
    

    这意味着在构建时配置环境变量时,您需要找到一种与现有变量合并的方法。 您需要对两个数组执行深度合并,以便 process.env 键的值是一个对象,其中包含来自已解析客户端环境的键和您的键。

    chainWebpackvue.config.js 的默认导出键只是完成此操作的方法之一。

    用于初始化DefinePlugin 的参数可以与您喜欢使用底层webpack-chain API 配置的新环境变量合并。这是一个例子:

    // vue.config.js
    
    const merge = require('deepmerge');
    const pkgVersion = require('./package.json').version;
    
    const VERSION = {
       'process.env': {
         VERSION: JSON.stringify(pkgVersion)
       }
    }
    
    module.exports = {
      chainWebpack: config => 
        config
          .plugin('define')
          .tap(
              args => merge(args, [VERSION])
          )
    }
    

    【讨论】:

    • 这实际上是有道理的,因为 webpack 定义插件文档 (webpack.js.org/plugins/define-plugin) 明确指出更喜欢这种语法。但是,它不起作用:-/
    • 尝试了deepmerge 策略,但没有奏效。我将尝试一个全新的 vue-cli 3 项目,以检查我的项目中的某些更改是否导致问题发生。
    • 谢谢你,我最后解决了这个问题,你的回答对我帮助很大。
    【解决方案4】:

    你最初的尝试很好,你只是错过了JSON.stringify 部分:

    const webpack = require('webpack');
    
    module.exports = {    
      configureWebpack: config => {
        return {
          plugins: [
            new webpack.DefinePlugin({
              'process.env': {
                VERSION: JSON.stringify(require('./package.json').version),
              }
            })
          ]
        }
      },
    }
    

    编辑:虽然webpack docs 推荐'process.env.VERSION' 方式(黄色面板):

    new webpack.DefinePlugin({
      'process.env.VERSION': JSON.stringify(require('./package.json').version),
    }),
    

    【讨论】:

    • 谢谢。正如您所说,整个工作都需要JSON.stringify:否则,您在尝试打印时会出错。然而,这并不是VERSION 键没有出现在我的process.env 中的原因。
    【解决方案5】:

    您可以简单地导入您的 package.json 文件并使用它的变量。

    import { version } from "../../package.json";
    
    console.log(version)
    

    如果你使用的是Webpack,你可以通过以下方式注入变量:

    // webpack.config.js
      plugins: [
        new webpack.DefinePlugin({
          VERSION: JSON.stringify(require("package.json").version)
        })
      ]
    
    // any-module.js
    console.log("Version: " + VERSION);
    

    https://github.com/webpack/webpack/issues/237

    【讨论】:

    • 最容易实现的最直接的答案。
    【解决方案6】:

    官方解决方案往往更可靠Modes and Environment Variables | Vue CLI

    提示

    您可以在 vue.config.js 文件中计算环境变量。它们仍然需要以 VUE_APP_ 为前缀。这对于版本信息很有用

    process.env.VUE_APP_VERSION = require('./package.json').version
    
    module.exports = {
      // config
    }
    

    【讨论】:

    • 我使用这个解决方案解决了这个问题。对于阅读本文的任何人,您可能需要重新启动开发服务器才能访问该变量。
    【解决方案7】:

    我尝试了接受的答案,但出现了错误。但是,在 vue 文档中,我能够找到与 @antoni 的答案相似(但不完全)的答案。

    简而言之,只需在vue.config.js 中有以下内容:

    process.env.VUE_APP_VERSION = require('./package.json').version
    
    module.exports = {
      // config
    }
    
    

    Docs 2020-10-27:

    您可以在应用程序代码中访问环境变量:

    process.env.VUE_APP_NOT_SECRET_CODE = require('./package.json').version

    在构建期间,process.env.VUE_APP_NOT_SECRET_CODE 将被相应的值替换。在VUE_APP_NOT_SECRET_CODE=some_value的情况下,将被"some_value"替换。

    除了VUE_APP_* 变量之外,还有两个特殊变量将始终在您的应用代码中可用:

    • NODE_ENV - 这将是“开发”、“生产”或“测试”之一,具体取决于应用运行的模式。

    • BASE_URL - 这对应于 vue.config.js 中的 publicPath 选项,是您的应用部署的基本路径。

    【讨论】:

    • 目前应该接受这个答案,其他解决方案不起作用
    【解决方案8】:

    VueJS 官方论坛上的answer 是这样的:

    chainWebpack: config => {
      config
        .plugin('define')
          .tap(args => {
            let v = JSON.stringify(require('./package.json').version)
            args[0]['process.env']['VERSION'] = v
            return args
          })
    }
    
    

    说明

    将此行添加到您的 vue.config.js 文件中

    module.exports = {
        ...
        chainWebpack: config => {
            config
                .plugin('define')
                .tap(args => {
                    let v = JSON.stringify(require('./package.json').version)
                    args[0]['process.env']['VERSION'] = v
                    return args
                })
        }
    };
    

    然后你可以像这样在你的 vue 文件中使用它:

    version: function () {
                return process.env.VERSION
            }
    

    【讨论】:

      【解决方案9】:

      单线替代方案:

      //script tag
      let packageJsonInfo = require("../../package.json");
      
      //Then you can for example, get the version no
      packageJsonInfo.version
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多