我遇到问题安装正确的js来自cdn网址,并通过查看超过10篇文章或帖子后,我找不到一个好方法来做到这一点。angular2 TS导入cds js与系统JS
我想要安装在我的角度项目中使用的js文件是http://player.twitch.tv/js/embed/v1.js。目前,我只在我的index.html中加载了一个脚本标签。
在组件文件中我有代码,如this.player = new Twitch.Player("video-player", options);
,但是当我运行npm start
时,出现错误错误TS2304:找不到名称'Twitch'。
奇怪的是,如果我注释掉使用'Twitch'的行,我可以启动我的服务器,然后在服务器运行时取消注释行,然后应用程序正常运行,并使用Twitch播放器库没有任何问题。
我相信我需要将它安装在system.config.js文件中,但是我找不到如何为来自cdn的js(这不是通过npm提供的)执行此操作。我已经为多个npm包做了这个,但是从cdn我有点失落。
我不是100%确定如果我需要在systemjs中做到这一点,所以如果这是不正确的,请忽略这篇文章的其余部分,让我知道你的建议 - 我只需要在js文件中的Twitch在我的应用程序中被识别和使用。
我发现了几个不同的方法来尝试这个。一个是load the module directly from the url。
// index.html
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
System.import('http://player.twitch.tv/js/embed/v1.js');
</script>
// main.js
import {bootstrap} from '@angular/platform-browser-dynamic';
import {AppComponent} from './app.component';
import "angular2-materialize";
import "twitch-api";
使用这种方法,我不确定如何将它加载到我的应用程序中。 import "twitch-api"
不像npm包那样工作,如angular2-materialize,因为它没有映射到system.config.js文件中。不知道这种方式是否可行。
另一种方法是load it in the system.config.js file。有了这个方法,我添加了一个包含url的地图对象给js文件。我想也许整个system.config.js文件是相关的,所以我会粘贴下面。
在main.ts中,我执行与上述相同的操作,在此添加import "twitch-api";
执行这些更改后,尝试启动服务器TS2304: Cannot find name 'Twitch'
时仍然收到相同的错误消息。
var map = {
'app': 'app', // 'dist',
'rxjs': 'node_modules/rxjs',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'@angular': 'node_modules/@angular',
"materialize-css": "node-modules/materialize-css",
"materialize": "node_modules/angular2-materialize",
"angular2-materialize": "node_modules/angular2-materialize",
"angular2-localstorage": "node_modules/angular2-localstorage",
"twitch-api": "http://player.twitch.tv/js/embed/v1.js"
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' },
"materialize-css": { main: "dist/js/materialize" },
"materialize": { main: "dist/materialize-directive", defaultExtension: "js" },
"angular2-localstorage": {main: "index.js", defaultExtension: 'js'},
"twitch-api": {}
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
''
];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
}
System.config(config);
嘿谢谢你把它放在一起。这个答案并不完全是“正确的”,但你提到这是一个TS编译错误,这让我足以让谷歌更好。我需要声明'Twitch:any;'然后它一切正常。我相信有一个更好的方法来做到这一点,但它现在起作用!谢谢。 – awwester