为啥在另一个 Typescript 项目中导入时没有得到导出的对象?

Posted

技术标签:

【中文标题】为啥在另一个 Typescript 项目中导入时没有得到导出的对象?【英文标题】:Why am I not getting the exported Object when importing in another Typescript project?为什么在另一个 Typescript 项目中导入时没有得到导出的对象? 【发布时间】:2019-04-17 15:06:09 【问题描述】:

我正在尝试创建一个通过 Typescript 编写的 React 组件库,该组件库应导入另一个 Typescript 项目。准确地说,我想将一个 Analytics 图表库导入到 storybook 以进行演示和测试。

为此,我将这些依赖项用于库:

“打字稿”:“^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", 还有更多...

故事书还有这些额外的依赖项:

“@storybook/react”:“^4.0.4” 上述所有其他内容 还有更多...

此外,我的库的 tsconfig.json 中有以下设置:

“模块”:“esnext”, “moduleResolution”:“节点”, “target”:“es5”(这是故意的) 等

Webpack 生成一个简洁的 d.ts 文件,其中(除其他外)包含:

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;

最后但同样重要的是,libraryTarget 是 UMD。

现在,当我尝试像这样在故事书中导入库时:

import * as Analytics from "mylibrary";

然后做一个

console.log(Analytics)

我明白了

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

在控制台中。这并不完全有用,因为我期望的是一个我可以使用的对象(如 d.ts 中所定义)。

所以,我一定是在做和/或误解了关于出口和进口的一些根本错误。如果有人能指出正确的方向,我将不胜感激。如果需要更多详细信息,请告诉我。

非常感谢

沃尔特

编辑: Minimal project setup

在“analytics”文件夹中,运行“yarn install && yarn run dist” 转到文件夹“storybook”并运行“yarn install && yarn start-storybook” 打开浏览器并转到 localhost:6006 检查开发控制台 注意以“你去!”开头的消息 我希望有一个包含所有 Analytics 工厂的对象,而不是一个模块或未定义...

【问题讨论】:

根据您提供的信息,这对我来说很难重现。你能发布一个重现问题的存储库吗? 嗨,Matt,我担心该项目不是开源的,因此,我不能简单地在此处发布到存储库的链接。但是,我很乐意为您提供您可能需要的任何详细信息,例如 webpack.conf.js 或类似... 我不是要原始存储库,只是要一个重现相同问题的存储库;除了演示问题所需的最少量代码外,您可以删除所有代码。我知道这需要你做一些工作,但如果你这样做,我想我很有可能找到并解决问题,而我不愿意花时间向你询问更多细节一个时间,所以决定它是否值得你。或者你可以等着看有没有人愿意帮忙。 好的。我在上面附上了一个最小的设置和说明。非常感谢您的帮助。 【参考方案1】:

看起来问题在于您在analytics 上启用了静态代码拆分,因此Webpack 生成了两个包,vendors~Analytics.chunk.jsAnalytics.jsAnalytics.js 依赖于vendors~Analytics.chunk.js;要导入 Analytics.js 以返回有用的值,您必须先手动加载 vendors~Analytics.chunk.js。您可以在导入analytics 之前将以下内容添加到storybook/stories/1_overview.stories.tsx

import "analytics/vendors~Analytics.chunk";

但我看不出您希望通过启用代码拆分并让analytics 库的所有用户执行此额外导入来在这种情况下获得什么。我建议通过从analytics/webpack.config.ts 中删除以下内容来关闭代码拆分:

splitChunks: 
  chunks: "all"

【讨论】:

以上是关于为啥在另一个 Typescript 项目中导入时没有得到导出的对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 CRA 2.1 Typescript 中导入时 ESLint 需要“.ts”

Js文件在Angular项目中导入时不起作用

为啥不能在 TypeScript 中导出类实例?

为啥在 TypeScript 中导入 CSS 不起作用?

从 NPM 包中导出多个模块

在 phpMyAdmin 中导入时“未选择数据库”