从React Redux中的package.json获取版本号(create-react-app)

Bal*_*eep 33 node.js npm reactjs react-redux create-react-app

OP编辑:如果有其他人遇到这个:该应用程序是使用create-react-app创建的,它限制导入到src文件夹中.但是,如果将react-scripts升级到v1.0.11,则允许您访问package.json.

我想在我的应用程序中从package.json获取版本号.

我已经尝试过这些建议,但是没有一个能够工作,因为我无法从src文件夹外部访问package.json(可能是由于React,我是新手).移动的package.json到SRC那么意味着我不能跑npm install,npm version minornpm run build从我的根文件夹.我尝试过使用process.env.npm_package_version但结果是未定义的.

我正在使用Jenkins,我还没有设置它来提交提交,但我唯一的想法是从GitLab中的标签获取版本,但我不知道如何做到这一点,它会给回购添加不必要的依赖,所以我真的想找到一个替代方案.

编辑:我的文件结构如下:

--> RootAppFolder
    |--> build
    |--> node_modules
    |--> public
    |--> src
         |--> Components
              |--> Root.js
    |
    |--> package.json
Run Code Online (Sandbox Code Playgroud)

所以要从Root.js访问package.json我必须这样做import packageJson from './../../package.json',然后我收到以下错误:

./src/components/Root.js

找不到模块:您试图导入位于项目src /目录之外的./../../package.json.不支持src /之外的相对导入.你可以在src /中移动它,或者从项目的node_modules /中添加一个符号链接.

tal*_*ves 63

没有进口和暴露解决这个package.jsoncreate-react-app

需要:create-react-app的1.1.0+版本

.env

REACT_APP_VERSION=$npm_package_version
REACT_APP_NAME=$npm_package_name
Run Code Online (Sandbox Code Playgroud)

index.js

console.log(`${process.env.REACT_APP_NAME} ${process.env.REACT_APP_VERSION}`)
Run Code Online (Sandbox Code Playgroud)

注意:可以访问版本(以及许多其他 npm配置参数)

  • 更改`.env`后不要忘记再次`npm start` (6认同)
  • 我必须在存储库根目录中创建`.env`(作为纯文本文件)以使其工作。喜欢它 (4认同)
  • @JoeMaffei这是一个很好的解决方案,但是使用来自“ ../package.json”;的`import {name,version}来引用`package.json`文件是不那么神秘的,不需要创建`.env`。文件。 (4认同)
  • 刚刚发现 .env 文件中的 `NEXT_PUBLIC_APP_VERSION=$npm_package_version` 也适用于 next.js (我使用的是 9.5.3),尽管我没有在任何地方看到它的记录。 (4认同)
  • @TheDarkIn1978 但它不能与 Create React App 一起使用,因为它不允许引用 `src/` 之外的内容。 (2认同)

小智 33

试试这个.

// in package.json
"version": "1.0.0"

// in index.js
import packageJson from '../package.json';
console.log(packageJson.version); // "1.0.0"
Run Code Online (Sandbox Code Playgroud)

  • 这将在您的包中导入整个package.json (8认同)
  • 没有安全感!您不想将 package.json 暴露给用户和黑客 (6认同)
  • @ inferus-vv,您可以从'../package.json';中导入{版本}; (5认同)

小智 28

我认为通过 'import' 或 'require' 包获取版本是不正确的。您可以在 package.json 中添加脚本

"start": "REACT_APP_VERSION=$npm_package_version react-app-script start",
Run Code Online (Sandbox Code Playgroud)

您可以通过任何 js 文件中的“process.env.REACT_APP_VERSION”获取它。

它也适用于构建脚本,如下所示:

"build": "REACT_APP_VERSION=$npm_package_version react-app-script build",
Run Code Online (Sandbox Code Playgroud)


ken*_*ire 16

从你的编辑我建议尝试

import packageJson from '/package.json';
Run Code Online (Sandbox Code Playgroud)

您还可以尝试创建符号链接:

# From the project root.
cd src; ln -s ../package.json package.alias.json
Run Code Online (Sandbox Code Playgroud)

列出src目录的内容,你会看到符号链接.

ls
#=> package.alias.json -> ../package.json
Run Code Online (Sandbox Code Playgroud)

.alias在查看此内容时,添加帮助会减少其他人和您未来的魔力.此外,它还可以帮助文本编辑将它们分开.你以后会感谢我的.只需确保更新要导入的JS代码./package.alias.json而不是./package.json.

另请看一下这个问题: 在src目录之外的create-react-app导入限制

  • 将 package.json 添加到您的包中并不是一个好主意。它会将您的所有依赖项暴露给潜在的攻击者,而且它是一个相当大的对象,而您需要的数据只有几个字节。 (6认同)
  • 谁在乎是否有人反编译应用程序并看到它使用任何库?为什么这是一个安全问题?防止人们反编译您的代码的唯一方法是首先不要发送二进制文件。 (4认同)
  • 这不应该是公认的答案,您不应该在客户端构建中加载应用程序设置。查看依赖于构建时读取的环境变量的更多赞成票的答案。 (2认同)
  • 为什么 `package.json` 是一个“相当大的对象”,太大而无法导入?这是几行 JSON。 (2认同)

Tom*_*hen 7

导入 package.json

一般来说,进口package.json不好。原因:安全和包大小问题

是的,最新的WebPack(默认配置)+ ES6import确实树摇动(即只包括"version"值,而不是整个package.json)两个import packageJson from '../package.json'import { version } from '../package.json'。但是如果你使用 CommonJS ( require()),或者改变了你的 webpack 配置,或者使用另一个打包器/转译器,则不能保证。依靠捆绑器的摇树来隐藏您的敏感数据很奇怪。如果您坚持导入package.json但不希望全部package.json暴露,您可能需要添加一些构建后检查以确保package.json删除其他值。

然而,对于package.json毕竟是公开的开源项目,这里的安全问题仍然是理论上的。如果安全性和包大小都没有问题,或者无保证的 tree-shaking 对你来说已经足够了,那么继续)

.env

.env方法,如果有效,那么它很好,但是如果您不使用create-react-app,则可能需要安装dotenv并进行一些额外的配置。还有一个小问题:不建议提交.env文件(此处此处),但是如果您执行该.env方法,则看起来您必须提交文件,因为它可能对您的程序工作至关重要。

最佳实践(可以说)

(这不是主要用于create-react-app,但您仍然可以使用react-app-rewired弹出 cra以便webpack在 cra 中进行配置)

如果您使用webpack,然后使用DefinePlugin

plugins: [
  new webpack.DefinePlugin({
    'process.env.VERSION': JSON.stringify(
      process.env.npm_package_version,
    ),
  }),
]
Run Code Online (Sandbox Code Playgroud)

您现在可以console.log(process.env.VERSION)在您的前端程序(开发或生产)中使用。

(你可以简单地使用VERSION,而不是process.env.VERSION,但它通常需要额外的配置,以满足棉短绒:附加globals: {VERSION: 'readonly'}.eslintrcDOC);附加declare var VERSION: string;.d.ts文件打字稿)

尽管它是“ npm _package_version”,但它也适用yarn。这是 npm 公开的环境变量的列表

其他打包器可能有类似的插件,例如@rollup/plugin-replace