通过 npm 为 Angular 2 TypeScript 项目安装 d3.js 有啥好处吗?

Posted

技术标签:

【中文标题】通过 npm 为 Angular 2 TypeScript 项目安装 d3.js 有啥好处吗?【英文标题】:Is there any benefit installing d3.js via npm for Angular 2 TypeScript project?通过 npm 为 Angular 2 TypeScript 项目安装 d3.js 有什么好处吗? 【发布时间】:2016-11-11 05:05:09 【问题描述】:

TL;DR: d3.js 应该通过 npm 安装,打字也是如此。接受的答案有详细信息。当我写这个问题时,我是 Angular 的新手。 npm 过程是标准的:用于摇树、包管理、更新等


我有一个 Angular 2 项目(为简单起见,它是 Quick Start 项目),我正在导入 d3.js 版本 4。d3 没有 TypeScript 定义,因为它只是 javascript

在 index.html 中我添加了 lib:

<script src="https://d3js.org/d3.v4.min.js"></script>

在打字稿 app.component.ts 中,我引用了 d3.select().... 它工作正常 - 画了一个圆圈:

d3.select("body").append("svg").attr("width", 50).attr("height", 50).append("circle").attr("cx", 25).attr("cy", 25).attr("r", 25).style("fill", "purple");

Visual Studio Code 无法识别 d3,因此我从 DefinitiveTyped 安装了类型 - 然后 IDE 识别 d3,并获得代码完成等:

typings install dt~d3 --save --global

现在,我尝试了第二个项目,但选择了npm 路线,npm install --save d3,我可以通过 index.html 中的 node_modules 使用

引用 d3.js
<script src="node_modules/d3/build/d3.min.js"></script>

但是,我不明白为什么我会在这种情况下使用 npm?我没有在 component.ts 文件中使用 d3 的 import 语句,它仍然可以正常工作。也许我在这里遗漏了一些东西?

【问题讨论】:

d3 是在 d3.min.js 中的全局范围内定义的,所以只要文件包含在页面中就不需要导入任何东西。 Npm 在这里并没有增加任何好处(除了它为你管理依赖项) 如果我不使用全局范围......它会工作吗?我无法使用导入来实现它 我想会,但我不熟悉打字稿项目。恐怕在这方面我无法为您提供更多帮助。 import * as d3 from 'd3';有效,但我使用了 angular2-seed 设置。不得不 npm install d3@3.5.17,因为 v4 存在导入问题。 systemjs需要在angular 2 quickstart中配置,但是angular2-seed会自动导入 【参考方案1】:

到目前为止,您基本上有以下两个基于 import 的选项来利用 D3 版本 4(始终以使用 TypeScript 2 为条件):

选项 1(使用标准 D3 捆绑包)

npm install --save d3(安装 Standard D3 v4 Bundle 的常规方法) npm install --save-dev @types/d3(安装 Standard D3 v4 Bundle 的定义)如果您正在构建一个供其他 Angular 2 应用程序使用的库,您应该使用 --save,以便库使用者可以在支持打字的情况下进行开发) 现在您可以使用import * as d3 from 'd3',例如在创建单例 D3 服务的模块中,该服务将根据需要注入到组件中。

选项 2(仅使用您需要的)

npm install --save d3-selection d3-transition d3-shape d3-scale 只安装项目所需的模块 npm install --save-dev @types/d3-selection @types/d3-transition @types/d3-shape @types/d3-scale(安装匹配的定义。同样,根据您的用例,使用 --save 而不是 --save-dev。) 为方便起见,您现在可以将这些模块捆绑在一个 barrel 模块中 d3-bundle.ts

例如

// d3-bundle.ts    
export * from 'd3-selection';
export * from 'd3-transition';
export * from 'd3-shape';
export * from 'd3-scale';
从包中导入(使用适当的相对路径)以创建单例 D3 服务,即import * as d3 from './d3-bundle'

选项 2 下的方法本质上是 d3-ng2-service 所做的。如果发布的服务不适合,它还可以让您了解如何构建自己的 D3 服务。当然,您可以随时提出改进建议。

我会说,将基于导入的选项与 angular-cli 一起使用变得越来越容易,因为它已更改为 Webpack 2 进行模块加载/捆绑。

【讨论】:

以上是关于通过 npm 为 Angular 2 TypeScript 项目安装 d3.js 有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NPM 安装 Angular 2?

在 Angular 2 应用程序中使用本地 npm 存储库中的组件

通过 npm 命令将参数传递给 Angular 6 应用程序 [重复]

如何修复 npm 无法全局安装 typescript 错误

Angular 2 / Typescript - 如何检查对象数组以查看属性是不是具有相同的值?

如何正确将 angular 2 (npm) 升级到最新版本?