commonjs - Bygga ett Typescript-bibliotek med både standard- och namngivna exporteringar?
Jag gillar hur React kan importeras som ett standardobjekt som import React from 'react' och importeras på ett destrukturerat sätt, som import { useEffect } from 'react' eller till och med import * as Whatever from 'react' om man känner sig fräck. Jag försöker bygga mitt eget TypeScript-bibliotek för npm som kan importeras på alla dessa 3 sätt (utöver det vanliga require-syntakt, och jag har spenderat omkring 15 timmar på det hittills utan att kunna få det att fungera (frustrerande).
Just nu använder jag rollup för att bygga lib/cjs och lib/esm, för att stödja både CommonJS och Modules. Jag låter också typescript-kompilatorn (tsc) bygga typfiler och lägga dem i /lib/types.
Men det jag VERKLIGEN sitter fast på är hur jag ska exportera mina filer på samma sätt som React gör. Hittills använder jag en index.ts 'barrel-fil' i roten av mitt bibliotek, som är något i stil med:
export * från './filename1' export * från './filename2' ...
Men detta ger uppenbarligen inte en standardexport för mitt bibliotek. Finns det någon sorts index.d.ts-moduldeklarationsmagi jag behöver göra? Alla tips/tutorials om att bygga ett TypeScript-bibliotek skulle vara till hjälp. Jag har lyckats få både standardimporter och namngivna importer att fungera för mitt bibliotek, men inte båda samtidigt.
Svar #1
Du kan importera allt först och sedan använda export default för att exportera allt.
import * as filename1 from './filename1';
import * as filename2 from './filename2';
export default {
...filename1,
...filename2
};
Fungerar det här för dig?
Svar #2
Detta borde vara en kommentar, men hänvisa till detta svar. Du kan kombinera exports och ett enskilt default-export i en enda fil. Du måste göra lite arbete för att bygga standardobjektet på det sätt du vill, men följande bör fungera:
import * as filename1 from './filename1';
import * as filename2 from './filename2';
// build defaultObject as desired
const defaultObject = Object.assign({}, filename1, filename2)
export default defaultObject;
export * from './filename1';
export * from './filename2';
