如何从npm包(ESM)中的项目根目录读取.ts配置文件
How to read the .ts configuration file from the root of the project in the npm package (ESM)
如何从基于 ESM 构建的 npm 模块中的项目根目录中读取配置文件(例如 mypkg.config.ts
)?
我找到了 ,并想出了 .json
的方法,但 .ts
没有。
经过几个小时的搜索,我在Vite的源码中找到了我需要的东西。
您所要做的就是使用 esbuild 将您的配置文件转换为 JavaScript,然后使用:
导入它
const config = await import(`file://${absolutePathToTranspiledConfig}`)
然后删除生成的JavaScript文件。
具体来说,Vite使用了如下的转译脚本:
await build({
entryPoints: [/*path to config with .ts extension*/],
bundle: true,
minify: true,
platform: 'node',
outfile: /*path to transpiled config*/,
sourcemap: 'inline',
metafile: true,
format: 'esm',
plugins: [
{
name: 'externalize-deps',
setup(build) {
build.onResolve({ filter: /.*/ }, args => {
const id = args.path
if (id[0] !== '.' && !path.isAbsolute(id)) {
return {
external: true
}
}
})
}
},
{
name: 'replace-import-meta',
setup(build) {
build.onLoad({ filter: /\.[jt]s$/ }, async args => {
const contents = await fs.readFile(args.path, 'utf8')
return {
loader: args.path.endsWith('.ts') ? 'ts' : 'js',
contents: contents
.replace(
/\bimport\.meta\.url\b/g,
JSON.stringify(`file://${args.path}`)
)
.replace(
/\b__dirname\b/g,
JSON.stringify(path.dirname(args.path))
)
.replace(/\b__filename\b/g, JSON.stringify(args.path))
}
})
}
}
]
})
如何从基于 ESM 构建的 npm 模块中的项目根目录中读取配置文件(例如 mypkg.config.ts
)?
我找到了 .json
的方法,但 .ts
没有。
经过几个小时的搜索,我在Vite的源码中找到了我需要的东西。
您所要做的就是使用 esbuild 将您的配置文件转换为 JavaScript,然后使用:
导入它const config = await import(`file://${absolutePathToTranspiledConfig}`)
然后删除生成的JavaScript文件。
具体来说,Vite使用了如下的转译脚本:
await build({
entryPoints: [/*path to config with .ts extension*/],
bundle: true,
minify: true,
platform: 'node',
outfile: /*path to transpiled config*/,
sourcemap: 'inline',
metafile: true,
format: 'esm',
plugins: [
{
name: 'externalize-deps',
setup(build) {
build.onResolve({ filter: /.*/ }, args => {
const id = args.path
if (id[0] !== '.' && !path.isAbsolute(id)) {
return {
external: true
}
}
})
}
},
{
name: 'replace-import-meta',
setup(build) {
build.onLoad({ filter: /\.[jt]s$/ }, async args => {
const contents = await fs.readFile(args.path, 'utf8')
return {
loader: args.path.endsWith('.ts') ? 'ts' : 'js',
contents: contents
.replace(
/\bimport\.meta\.url\b/g,
JSON.stringify(`file://${args.path}`)
)
.replace(
/\b__dirname\b/g,
JSON.stringify(path.dirname(args.path))
)
.replace(/\b__filename\b/g, JSON.stringify(args.path))
}
})
}
}
]
})