javascript - Last kun highlight.js-biblioteket ved hjelp av TypeScript, ikke standard med alle språk lastet


Som det offisielle dokumentet for bruk av highlight.js foreslår:

Standardimporten importerer alle språk! Derfor er det sannsynligvis mer effektivt å bare importere biblioteket og språkene du trenger:

import hljs from 'highlight.js/lib/highlight';
import javascript from 'highlight.js/lib/languages/javascript';
hljs.registerLanguage('javascript', javascript);

Jeg prøver å laste kun highlight.js-biblioteket, sammen med individuelle språkmoduler for å redusere fotavtrykket mitt for TS-appen min.

Ved å bruke @types/highlight.js-deklarasjonsfilen, er den eneste måten (som jeg kan finne) å importere highlight.js på slik:

import * as hljs from 'highlight.js';

Dessverre laster det standardeksporten, som har alle de leverte språkene lastet.

Når jeg ser på highlight.js-modulen, vil jeg gjøre noe sånt som dette:

import * as hljs from 'highlight.js/lib/highlight.js';
import * xml from 'highlight.js/lib/languages/xml';
...
hljs.registerLanguage('xml', xml);

så jeg får bare selve biblioteket, sammen med det eneste språket jeg trenger (xml).

Så langt har jeg vært i stand til å legge til disse linjene i en .d.ts-fil for å få TypeScript til å ikke klage på disse importene:

declare module 'highlight.js/lib/highlight';
declare module 'highlight.js/lib/language/xml';

Men selvfølgelig, det betyr at jeg mister innholdsassistenten min når jeg importerer hljs. Jeg kunne duplisere innholdet i @types/highlight.js til min egen .d.ts-fil, men jeg vil virkelig gjerne unngå det.

Finnes det noen måte jeg kan videresende deklarasjonene fra @types/highlight.js til modulen highlight.js/lib/highlight'? Eller kanskje en annen tilnærming jeg går glipp av.

Takk på forhånd.

Svar #1

Jeg løste dette problemet ved å lage en Javascript-fil som bare krever de språkene jeg trenger:

myhighlight.js

var hljs = require('../../../node_modules/highlight.js/lib/highlight');
hljs.registerLanguage('typescript', require('../../../node_modules/highlight.js/lib/languages/typescript'));
hljs.registerLanguage('json', require('../../../node_modules/highlight.js/lib/languages/json'));
module.exports = hljs;

Og ved å importere denne filen i Typescript-koden min:

import hljs from './myhighlight';

export class SomeClass {
  highlight(code: string) {
    return hljs.highlightAuto(code).value;
  }
}

Svar #2

Bare inkluder typene ved å legge til denne linjen øverst i en av dine *.d.ts-filer (f.eks. global.d.ts)

/// <reference types="highlight.js/types/index.d.ts" />

Relaterte artikler