Använd javascript-bibliotek från typescript (med ärvda javascript-beroenden)
Kontext
Jag bygger ett projekt i ren Typescript för att kommunicera med en chattserver. För den kommunikationen använder jag strophe.js-biblioteket.
Strophe-biblioteket finns i tre varianter: commonjs, esm och umd. Jag förstår egentligen inte skillnaden mellan dessa format, enligt vad jag har sökt:
- commonjs är för node
- esm för webbappar
- umd är generisk
Baserat på detta skulle jag kunna använda esm eller umd, eftersom denna app är avsedd att köras i webbläsaren.
Jag skrev en Typescript-fil för att fungera som en wrapper till strophe-biblioteket. Så här importerar jag det:
import * as core from './dependencies/strophe.umd.js'; // using UMD
import core from './dependencies/strophe.esm.js'; // using ESM
const Strophe = core.Strophe;
// ...
// Usage example:
this.conn = new Strophe.Connection(options.connection, options.options);
Mitt problem
När du använder ESM-format:
Jag kan se gränssnittsdefinitionen, anropa dess funktioner osv. Allt är bra men webbläsaren kastar: Uncaught TypeError: Failed to resolve module specifier "abab". Relative references must start with either "/", "./", or "../".
När du använder UMD-format:
Inga fel visas först, men Strophe importeras inte korrekt. När man försöker anropa connect-funktionen kastas detta fel:
Uncaught TypeError: Cannot read property 'Connection' of undefinedUppdatera
Sandlåda: https://codesandbox.io/s/bitter-grass-sh4s9
För att testa detta kör jag tsc och sedan live-server för att serva filerna
tsconfig.json
{
"extends": "@tsconfig/recommended/tsconfig.json",
"compilerOptions": {
"target": "es2015",
"module": "es2015",
"baseUrl": "src",
"outDir": "build",
"sourceMap": false,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"allowJs": true,
"noImplicitAny": false,
"moduleResolution": "node",
"removeComments": true,
"lib": ["es2018", "dom"],
"types": ["jest", "node"],
"paths": {
"@core/*": ["./src/core"]
}
},
"include": ["src/**/*.ts"]
}
Svar #1
Det skulle vara en bra idé att lägga till Strophe.js som ett beroende genom en paketchef som npm eller Yarn. Det ser ut som att du manuellt har placerat dem i mappen som kallas dependencies.
Lägga till beroendet: yarn add strophe.js
Lägga till typerna: yarn add -D @types/strophe.js
Detta skulle ladda ner Strophe.js till din node_modules-mapp.
Importera det i din kod:
import { Strophe } from "strophe.js";
this.conn = new Strophe.Connection(options.connection, options.options);
