Rollup: håndtering af afhængigheder, der er TypeScript-filer. Får fejl: Uventet token


Her er et GitHub-repositorium, der reproducerer dette problem.

Jeg har denne package.json:

{
  "name": "rollup-ts-deps",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Mike Hogan",
  "license": "ISC",
  "devDependencies": {
    "@rollup/plugin-typescript": "^8.2.0",
    "rollup": "^2.41.0",
    "typescript": "^4.2.3"
  },
  "dependencies": {
    "@http4t/core": "0.0.121"
  }
}

og denne rollup.config.js

import typescript from '@rollup/plugin-typescript';

export default {
    input: 'src/index.ts',
    output: {
        file: 'lib/index.js',
        format: 'cjs'
    },
    plugins: [
        typescript()
    ]
};

og src/index.ts indeholder dette:

import {post} from "@http4t/core/requests";

console.log(post)

Når jeg kører npx rollup -c, får jeg:

[!] Error: Unexpected token (Note that you need plugins to import files that are not JavaScript)
node_modules/@http4t/core/requests.ts (5:30)
3: import {Authority, Uri, UriLike} from "./uri";
4: 
5: export function request(method: Method, uri: UriLike, body?: HttpBody, ...headers: Header[]): HttpRequest {

Hvordan konfigurerer jeg rollup til at håndtere afhængigheder, der er Typescript-filer?

Svar #1

Dette commit demonstrerer en løsning på problemet.

Sammenfattende har jeg tilføjet følgende tsconfig.json-fil:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ES2020",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist/esm",
    "declaration": true,
    "moduleResolution": "node"
  },
  "include": [
    "./src",
    "node_modules/@http4t"
  ]
}

Det vigtige er at inkludere node_modules/@http4t som en kildemappe.

frederikhors kommentarer på dette problem var det afslørende bidrag.

Svar #2

Jeg brugte timer på at prøve at finde en løsning på dette, og det viste sig at være et simpelt problem med plugin-rækkefølgen. 😔

Du skal bruge @rollup/plugin-node-resolve for at hente tredjepartsmoduler fra node_modules. Det gjorde jeg allerede, men jeg brugte TypeScript-pluginet først. At bytte rækkefølgen løste problemet for mig:

// rollup.config.js
import nodeResolve from '@rollup/plugin-node-resolve';
import typescript from '@rollup/plugin-typescript';

export default {
    // ...
    plugins: [
        nodeResolve(), // must come before the typescript plugin!
        typescript(),
    ]
};

Relaterede artikler