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
我想在 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