webpack - Varför får jag inte det exporterade objektet när jag importerar i ett annat Typescript-projekt?


Jag försöker skapa ett React-komponentbibliotek skrivet med Typescript som ska importeras till ett annat Typescript-projekt. För att vara exakt vill jag importera ett Analytics-diagrambibliotek till ett storybook för demonstrations- och teständamål.

För att göra det använder jag dessa beroenden för biblioteket:

  • "typescript": "^3.1.6"
  • "webpack": "^4.15.1"
  • "babel-loader": "^8.0.4"
  • "ts-loader": "^5.3.0"
  • "@babel/core": "^7.1.5",
  • "@babel/runtime": "^7.1.5",
  • "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
  • "@babel/plugin-syntax-dynamic-import": "^7.0.0",
  • "@babel/preset-env": "^7.1.5",
  • många fler...

Och jag dessa ytterligare beroenden för storybook:

  • "@storybook/react": "^4.0.4"
  • alla de andra som nämns ovan
  • många fler...

Dessutom har jag dessa inställningar i tsconfig.json för mitt bibliotek:

  • "module": "esnext",
  • "moduleResolution": "node",
  • "target": "es5" (detta är medvetet)
  • osv.

Webpack genererar en snygg d.ts-fil som (bland annat) innehåller:

declare module 'mylibrary' {
     import { BarChartFactory } from 'mylibrary/factories/barChartFactory';
     import { LineChartFactory } from 'mylibrary/factories/lineChartFactory';
     import { PieChartFactory } from 'mylibrary/factories/pieChartFactory';
     import { AreaChartFactory } from 'mylibrary/factories/areaChartFactory';
     import { RadarChartFactory } from 'mylibrary/factories/radarChartFactory';
     import { ScatterChartFactory } from 'mylibrary/factories/scatterChartFactory';
     import { GaugeChartFactory } from 'mylibrary/factories/gaugeChartFactory';
     import { HeatmapChartFactory } from 'mylibrary/factories/heatmapChartFactory';

     const Analytics: {
         "barChart": typeof BarChartFactory;
         "lineChart": typeof LineChartFactory;
         "pieChart": typeof PieChartFactory;
         "areaChart": typeof AreaChartFactory;
         "radarChart": typeof RadarChartFactory;
         "scatterChart": typeof ScatterChartFactory;
         "gaugeChart": typeof GaugeChartFactory;
         "heatmapChart": typeof HeatmapChartFactory;
     };
     export default Analytics;
}

Sist men inte minst är libraryTarget UMD.

Nu, när jag försöker importera biblioteket i Storybook på det här sättet:

import * as Analytics from "mylibrary";

och sedan göra en

console.log(Analytics)

Jag får

Module
    Symbol(Symbol.toStringTag): "Module"
    __esModule: true
    __proto__: Object

i konsolen. Detta är inte exakt användbart, eftersom det jag förväntar mig är ett objekt som jag kan använda (som definierat i d.ts)..

Så, jag måste göra och/eller missförstå något fundamentalt fel om export och import. Jag skulle uppskatta det mycket om någon kunde peka i rätt riktning. Låt mig veta om fler detaljer behövs.

Tack så mycket

Walter

REDIGERA: Minimal projektuppsättning

  • I mappen "analytics", kör "yarn install && yarn run dist"
  • Gå till mappen "storybook" och kör "yarn install && yarn start-storybook"
  • Öppna en webbläsare och gå till localhost:6006
  • Kontrollera utvecklarkonsolen
  • Håll utkik efter ett meddelande som börjar med "Där har du det!"
  • Jag förväntar mig att det finns ett objekt som håller alla analysfabriker, snarare än en modul eller odefinierad...

Svar #1

Det ser ut som problemet är att du har aktiverat statisk kodsplittning på analytics, så Webpack genererar två bundles, vendors~Analytics.chunk.js och Analytics.js. Analytics.js är beroende av vendors~Analytics.chunk.js; för att en import av Analytics.js ska returnera ett användbart värde måste du manuellt ladda vendors~Analytics.chunk.js först. Du kan göra det genom att lägga till följande i storybook/stories/1_overview.stories.tsx innan importen av analytics:

import "analytics/vendors~Analytics.chunk";

Men jag ser inte vad du hoppas uppnå i detta scenario genom att ha kodsplittring aktiverad och låta alla användare av analytics-biblioteket göra denna extra import. Jag skulle föreslå att stänga av kodsplittring genom att ta bort följande från analytics/webpack.config.ts:

splitChunks: {
  chunks: "all"
}