typescript angular 2 -添加第三方库

ezykj2lf  于 2023-06-07  发布在  TypeScript
关注(0)|答案(8)|浏览(245)

我正在尝试使用angular 2 cli。
我想在我的项目中使用momentjs,所以下面是我所做的:
1.使用angular cli创建项目。
2.运行npm install --save moment
3.从src文件夹运行typings init + typings install --save moment
4.系统模块的附加力矩:

System.config({
  packages: {
    app: {
      format: 'register',
      defaultExtension: 'js'
    },
    moment: {
      map: 'node_modules/moment/moment.js',
      type: 'cjs',
      defaultExtension: 'js'
    }
  }
});

1.添加import * as moment from 'moment';到我想要的组件。
1.运行ng serve并获得:
[DiffingTSCompiler]:Typescript发现以下错误:app/angular-day-picker. ts(2,25):找不到模块“moment”。错误:[DiffingTSCompiler]:Typescript发现以下错误:app/angular-day-picker. ts(2,25):找不到模块“moment”。在DiffingTSCompiler中。doFullBuild(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/lib/broccoli/broccoli-typescript. js:二百零二:29)在DiffingTSCompiler上。rebuild(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/lib/broccoli/broccoli-typescript. js:一百零一:18)在DiffingPluginWrapper. rebuild(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/lib/broccoli/diffing-broccoli-plugin. js:八十七:45)at/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/node_modules/angular-cli/node_modules/broccoli/lib/api_compat. js:四十二:21在lib $rsvp $$internal $$tryCatch(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/node_modules/angular-cli/node_modules/rsvp/dist/rsvp. js:1036:16)在lib $rsvp $$internal $$invokeCallback(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/node_modules/angular-cli/node_modules/rsvp/dist/rsvp. js:1048:17)at/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/node_modules/angular-cli/node_modules/rsvp/dist/rsvp. js:三百三十一:11 at lib $rsvp $asap $$flush(/Users/vioffe/personal/angular-day-picker/node_modules/angular-cli/node_modules/angular-cli/node_modules/rsvp/dist/rsvp. js:1198:9)at doNTCallback0(node. js:430:(9)过程。_tickCallback(node. js:三五九:(十三)
下面是我的tsconfig.json文件:

{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "mapRoot": "",
    "module": "system",
    "moduleResolution": "node",
    "noEmitOnError": true,
    "noImplicitAny": false,
    "rootDir": ".",
    "sourceMap": true,
    "sourceRoot": "/",
    "target": "es5"
  },
  "files": [
    "typings/main.d.ts"
  ],
  "exclude": [
    "typings/browser.d.ts",
    "typings/browser"
  ]
}

我做错了什么?我在文档中找不到添加第三方库的指南。

2wnc66cl

2wnc66cl1#

当包含第三方库时,有两个部分...要执行的javascript代码,以及为IDE提供所有强类型优点的定义文件。
显然,如果应用程序要运行,第一个必须存在。最简单的方法是在托管Angular 2应用程序的html页面中包含带有<script src="thirdLib.js">标签的第三方库。这不会让你得到定义,所以你不会有IDE的好处,但应用程序将功能。(要阻止IDE抱怨它不知道变量'thirdlib',请将declare var thirdLib:any添加到ts文件中。因为它的类型是any,所以IDE不会为thirdLib提供代码完成功能,但也不会抛出IDE错误。)
要获取正在执行的代码 * 和定义 *,如果库是用Typescript编写的,则可以使用import {thirdLib} from 'thirdLibfolder/thirdLib'从代码中添加对该ts文件的引用。这个库的ts文件本身就具有执行代码和类型脚本定义。
如果这个库不是用Typescript编写的,而是某个好心人为它编写了第三个Lib.d.ts定义文件,那么可以在ts文件中用/// <reference path="thirdLibfolder/thirdLib.d.ts" />引用d.ts文件。然后仍然包含实际执行的javascript和上面提到的脚本引用。
这些文件的位置以及是否在引用中包含扩展名取决于您的项目设置以及您正在使用的打包程序和构建工具。Webpack将在node_modules文件夹中搜索import {...中引用的库,并将接受带有.ts扩展名和不带.ts扩展名的引用。Meteor将抛出一个错误,如果你包括.ts扩展。

m1m5dgzv

m1m5dgzv2#

首先,我们需要从npm安装ChartJS。

npm install chart.js --save

现在我们已经安装了ChartJS,我们需要在angular-cli-build.js文件中告诉CLI新JavaScript文件的位置,以便可以捆绑它。

var Angular2App = require('angular-cli/lib/broccoli/angular2-app');

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      'systemjs/dist/system-polyfills.js',
      'systemjs/dist/system.src.js',
      'zone.js/dist/**/*.+(js|js.map)',
      'es6-shim/es6-shim.js',
      'reflect-metadata/**/*.+(js|js.map)',
      'rxjs/**/*.+(js|js.map)',
      '@angular/**/*.+(js|js.map)',
      'chart.js/Chart.min.js',
    ]
  });
};

const map: any = {
  'chartjs': 'vendor/chart.js/'
};

const packages: any = {
  chartjs: { defaultExtension: 'js', main: 'Chart.min.js' }
};
tf7tbtn2

tf7tbtn23#

仍然不支持通过命令支持第三方库。
暂时执行以下操作:

  1. npm安装时刻
    1.将moment.js从node_modules/moment复制到src/assets/js/moment.js
    1.在index.html中包含assets/js/moment.js
    1.安装类型并将lib导入到你的.ts文件中你需要的地方
  2. run ng serve and enjoy using moment:)
    这个wiki页面给出了更详细的解释:
    https://github.com/angular/angular-cli/wiki/3rd-party-libs
yduiuuwa

yduiuuwa4#

Angular-cli在第三方库集成方面仍然存在一些问题。在他们把它修好之前,我可以给予你一个黑名单。假设你想在代码中使用_ of lodash。所以我会给予你我的工作代码场景。
安装lodash:

npm install lodash --save
typings install lodash --ambient --save

在此之前,请确保全局安装类型:

npm install typings -g

然后在你的angular-cli-build.json中,确保它保持这样:

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      ...
      'lodash/**/*.js'
    ]
  });
};

在system-config.ts中:

/** Map relative paths to URLs. */
 const map: any = {
   'lodash': 'vendor/lodash/lodash.js'
 };

 /** User packages configuration. */
 const packages: any = {
   'lodash': {
     format: 'cjs'
   }
 };

在你的src/index.html中添加这一行(这是奇怪的修复):

<script src="/vendor/lodash/lodash.js" type="text/javascript"></script>

现在,在你想要使用lodash的组件中,这样写:

declare var _:any;

@Component({
})
export class YourComponent {
  ngOnInit() {
     console.log(_.chunk(['a', 'b', 'c', 'd'], 2));
  }
}

对我很有效:)。我通过angular-cli在我的angular2项目中使用了大量的第三方库。

编辑

如果你的第三方库没有任何npm。在src文件夹下创建一个assets文件夹。然后,您可以为jscssimages添加单独的文件夹。把你的第三方js放到js文件夹里。然后你必须在index.html中引用js文件,如下所示:

<script src="assets/js/your_js.js"></script>

现在,当您执行ng serveng build时,它会自动使用您的assets/js更新公用文件夹。

qgelzfjb

qgelzfjb5#

如果你想包含的库不在typings中,你有两种方法可以将它包含在angular 2应用程序中:
1.使用npm:步骤a.使用包管理器安装库
步骤B.将库的路径添加到systemjs.config.js文件中的map对象。
示例:
'jquery':'npm:jquery/dist/jquery. js','d3':'npm:d3/build/d3.js'
步骤c.将其导入app.module.ts示例:
import 'jquery'; import 'd3';
步骤d.声明
例如:declare var $:任何;
声明var d3:任何;
1.您可以简单地将其包含在index.html中的脚本标记中并声明它。

eeq64g8w

eeq64g8w6#

答案可以在以下链接中找到:https://github.com/angular/angular-cli/issues/274#issuecomment-192490084

oknrviil

oknrviil7#

我现在还没有使用moment.js。所以我不确定,但在我看来,你试图使用moment.js作为一个类型脚本模块,也许它不是一个类型脚本模块。我建议另一种方法。不要使用moment.js作为模块来导入,而是使用d.ts文件。为了实现这一点,我使用tsd:打开cmd:

  • npm install tsd -g
  • tsd的全局安装
  • cd [您的项目目录]
  • 更改为项目根目录
  • tsd init
  • 创建一个tsd.json文件来跟踪已安装的d.ts文件
  • tsd安装瞬间-保存

在此之后,我在typescript中完成了代码:时刻
没有进一步测试…
我现在使用typings,而不是tds,作为TypeScript定义的管理器。Tds现在已弃用。
您可能可以安装moment.d.ts,如下所示:打字安装瞬间--环境--保存

相关问题