Rollup TypeScript: การประกาศใน dist + cjs + es
ฉันกำลังพยายามจัดแพ็กเกจไลบรารี TypeScript โดยใช้ rollup พร้อมกับไฟล์ประกาศ (d.ts) และฉันต้องการส่งออกทั้งเวอร์ชัน cjs และ es
ดังนั้นฉันจึงคิดคอนฟิก Rollup นี้ขึ้นมา:
const {nodeResolve} = require('@rollup/plugin-node-resolve')
const nodeExternals = require('rollup-plugin-node-externals');
const json = require('@rollup/plugin-json');
const commonjs = require('@rollup/plugin-commonjs');
const typescript = require('rollup-plugin-typescript2');
const packagePlugin = require('@mpen/rollup-plugin-package');
const cleanPlugin = require('@mpen/rollup-plugin-clean');
const findUp = require('find-up');
const {readFileSync} = require('fs');
module.exports = function rollupPresetTslib(opts = {}) {
const tsconfigFile = findUp.sync(opts.tsconfig ?? 'tsconfig.json')
const tsconfig = JSON.parse(readFileSync(tsconfigFile))
return {
input: tsconfig.files,
plugins: [
commonjs({
include: 'node_modules/**',
}),
nodeExternals({
builtins: true,
deps: true,
devDeps: false,
peerDeps: true,
optDeps: false,
}),
json(),
typescript({
abortOnError: process.env.NODE_ENV === 'production',
tsconfig: tsconfigFile,
...opts.typescriptOptions,
}),
nodeResolve({
extensions: ['.ts', '.json']
}),
packagePlugin(),
cleanPlugin(),
...opts.plugins ?? [],
],
watch: {
buildDelay: 200,
...opts.watch,
},
preserveSymlinks: true, // https://www.npmjs.com/package/@rollup/plugin-commonjs#usage-with-symlinks
preserveModules: false, // outputs multiple files
output: {
dir: 'dist',
format: 'cjs',
sourcemap: true,
inlineDynamicImports: false,
},
}
}
นี่ให้ผลลัพธ์ค่อนข้างดี แต่คอมไพล์ได้เฉพาะเป็น cjs:
ดังนั้นฉันจึงพยายามส่งออกไปยังทั้งสองรูปแบบโดยการเปลี่ยน output ดังนี้:
output: ['cjs', 'es'].map(format => ({
dir: `dist/${format}`,
format: format,
sourcemap: true,
inlineDynamicImports: false,
})),
แต่ตอนนี้ฉันได้ไฟล์ .d.ts สองสำเนาซึ่งฉันไม่ต้องการ:
แล้วฉันจะได้สำเนา หนึ่ง ชุดของไฟล์ d.ts พร้อมกับการสร้าง cjs และ es ได้อย่างไร?
คำตอบ #1
ฉันได้ตั้งค่า rollup ให้ส่งออกไฟล์เดียวไปที่ dist/index.d.ts และต่อเนื้อหาของ declarations.d.ts ของฉันเข้าไปโดยใช้สคริปต์ postbuild:
cat declarations.d.ts >> dist/index.d.ts
นี่คือเนื้อหาของ rollup.config.js ของฉัน:
import commonjs from '@rollup/plugin-commonjs';
import clear from 'rollup-plugin-clear';
import ts from 'rollup-plugin-ts';
import styles from 'rollup-plugin-styles';
import image from '@rollup/plugin-image';
import { builtinModules } from 'module';
import pkg from './package.json';
module.exports = {
input: pkg.source,
output: [
{ file: pkg.main, format: 'cjs', sourcemap: true },
{ file: pkg.module, format: 'esm', sourcemap: true }
],
external: [
...builtinModules,
...(pkg.dependencies ? Object.keys(pkg.dependencies) : []),
...(pkg.devDependencies ? Object.keys(pkg.devDependencies) : []),
...(pkg.peerDependencies ? Object.keys(pkg.peerDependencies) : [])
],
watch: {
include: 'lib/**'
},
plugins: [
clear({
targets: ['dist'],
watch: false
}),
ts({
hook: {
// Always rename declaration files to index.d.ts to avoid emitting two declaration files with identical contents
outputPath: (path, kind) =>
kind === 'declaration' ? './dist/index.d.ts' : path
}
}),
image(),
styles({
modules: true,
autoModules: /\.module\.\S+$/
}),
commonjs()
]
};
ฉันหวังว่าสิ่งนี้จะช่วยใครก็ตามที่กำลังหาวิธีแก้ปัญหา

