Node/Webpack:用 ES6 加载 package.json

Node/Webpack: Load package.json with ES6

我想在 ES6 环境中加载我的 package.json 并像 pkg.name 一样访问它。
到目前为止,我的解决方案是制作一个简单的模块,用于使用 fs 读取文件、解析它并在我需要访问它的每个地方导入该模块。

问题是,我想将我的脚本与 webpack 捆绑在一起,package.json 的路径被解析为我的电脑的当前路径我捆绑了所有东西。喜欢:D:/dev/app-name/package.json

这是错误的,我需要一种方法来 运行 之后的捆绑脚本,例如一台单独的电脑,或 linux,但仍能找到 package.json。有没有办法告诉 webpack 不解析这个路径,或者有另一种(更简单的)方法在我的脚本中使用“root”路径?

我的捆绑应用程序是一个快速服务器,我正在使用 webpack 5。

src/api/package-json.js:

import path from 'path'
import { fileURLToPath } from 'url'
import fs from 'fs-extra'

// Path CONST
// we need to change up how __dirname is used for ES6 purposes
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const PROJECT_ROOT = path.join(__dirname, '..', '..')
const PKG_FILE = path.join(PROJECT_ROOT, 'package.json')

// Package.json
const pkg = JSON.parse(fs.readFileSync(PKG_FILE)) // import pkg from '~root/package.json'

export default pkg

src/api/app.js:

import pkg from './package-json.js'
console.log(pkg.name)

webpack.config.js:

import path from 'path'
import { fileURLToPath } from 'url'
// import nodeExternals from 'webpack-node-externals'

// we need to change up how __dirname is used for ES6 purposes
const __dirname = path.dirname(fileURLToPath(import.meta.url))

const { NODE_ENV = 'production' } = process.env

export default {
    entry: './src/api/app.js',
    mode: NODE_ENV,
    target: 'node',
    node: {
        global: false,
        __filename: false,
        __dirname: false
    },
    output: {
        path: path.resolve(__dirname, 'dist', 'server'),
        filename: 'app.cjs'
    },
    resolve: {
        extensions: ['.js', '.jsx', '.ts', '.tsx']
    },
    externals: {
        'node-pty': 'commonjs2 node-pty'
    }
}

我找到了 process.cwd() 的解决方法,但我认为这不是解决我的问题的好方法。问题是,据我所知,process.cwd() 可以在运行时更改。 :(

src/api/package-json.js:

import path from 'path'
import fs from 'fs-extra'

// Path CONST
const PROJECT_ROOT = process.cwd()
const PKG_FILE = path.join(PROJECT_ROOT, 'package.json')

// Package.json
const pkg = JSON.parse(fs.readFileSync(PKG_FILE)) // import pkg from '~root/package.json'

export default pkg