bundler - Hur man kompilerar ett TypeScript-bibliotek till .mjs och inkluderar d.ts?


tsc fungerar nästan men jag kan inte få det att generera .mjs-filer. swc vill inte generera .mjs eller .d.ts-filerna.

Finns det en omfattande paketförpackare som kan göra båda?

Idealiskt vill jag rikta det mot min index.ts-fil som ser ut så här

export * from './map'
export * from './set'
export * from './array'

Och sedan kommer det att hitta de andra filerna och kompilera dem. Allt som inte finns i import/export-kedjan bör uteslutas från output, men om jag måste kompilera hela min src-katalog kan jag leva med det.


Ytterligare begränsningar:

  • Den kompilerade JS bör inkludera filändelser i sina import-/export-satser: https://stackoverflow.com/a/68783000/65387

    • Jag vill inte inkludera .js i min källa kod när jag försöker importera en .ts fil (https://stackoverflow.com/a/62626938/65387)

Jag tror att jag kan kringgå filändelsen .mjs genom att lägga till "type": "module" i package.json. Men jag behöver fortfarande att import-/export-satserna skrivs om korrekt (med filtillägg).

Svar #1

OK, jag tror att jag förstår. Svaret är Rollup.

yarn add --dev rollup @rollup/plugin-typescript @rollup/plugin-terser tslib
// rollup.config.js
import typescript from '@rollup/plugin-typescript';
import terser from '@rollup/plugin-terser';

export default {
    input: 'src/index.ts',
    output: {
        dir: 'dist',
        format: 'esm',
        entryFileNames: '[name].mjs'
    },
    plugins: [
        typescript(),
        terser({
            format: {
                comments: 'some',
                beautify: true,
                ecma: '2022',
            },
            compress: false,
            mangle: false,
            module: true,
        }),
    ]
};
// package.json
{
  "name": "@you/your-package",
  "version": "0.1.11",
  "packageManager": "[email ",
  "main": "dist/index.mjs",
  "type": "module",
  "types": "dist/index.d.ts",
  "files": [
    "/dist"
  ],
  "scripts": {
    "build": "rollup -c",
    "test": "jest --silent=false",
    "publish-patch": "npm version patch && hg ci -m \"Publish v$(jq -r '.version' package.json)\" && npm publish"
  },
  "devDependencies": {
    "@rollup/plugin-terser": "^0.2.1",
    "@rollup/plugin-typescript": "^10.0.1",
    "@types/jest": "^29.2.4",
    "jest": "^29.3.1",
    "rollup": "^3.9.0",
    "ts-jest": "^29.0.3",
    "tslib": "^2.4.1",
    "typescript": "^4.9.4"
  }
}

Det kommer att generera filer med .mjs-ändelse och inkludera .d.ts-filerna och utelämna annat skräp i din src-mapp som testfiler.

Terser behövs om du vill ta bort kommentarer från utdata. Bytet av filändelse för import/export är inte längre relevant eftersom Rollup insisterar på att endast outputta en enda fil.

tslib behövs för att göra rollup glad. Det samma gäller type: "module" även om TS inte bryr sig, och det gör inte Node heller om du använder .mjs-ändelsen.