Использование aws-sdk с angular2
Я пытаюсь получить мое приложение Angular2
, чтобы разрешить мне читать и записывать в ведро s3 на моей учетной записи AWS.
В AngularJS
(и большинстве других вещей) мы использовали aws-sdk
, поэтому я предполагаю, что то же самое можно сделать и для Angular2
.
Проблема, с которой я сталкиваюсь, заключается в том, чтобы aws-sdk
импортировать правильно в мой проект.
Я установил его через npm install aws-sdk
Я попытался импортировать его с помощью
import * as AWS from 'aws-sdk/dist/aws-sdk',
import * as AWS from 'aws-sdk',
import AWS from 'aws-sdk'
import AWS from 'aws-sdk/dist/aws-sdk'
но он продолжает говорить мне, что модуль не существует.
Мой проект основан на angular2 -seed.
Я также попытался установить файл typings из DefinitleyTyped с помощью typings install aws-sdk
, но это также не удалось.
Я не уверен, если мне нужно добавить что-нибудь еще, чтобы оно работало или нет.
Кроме того, я использую typescript
Спасибо за ваше время и помощь.
Ответы
Ответ 1
Из документов aws-sdk на NPM (https://www.npmjs.com/package/aws-sdk)
Использование TypeScript
AWS SDK для пакетов JavaScript TypeScript для использования в проектах TypeScript и для поддержки инструментов, которые могут читать файлы .d.ts. Наша цель - сохранить эти файлы определения TypeScript обновленными в каждой версии для любого публичного api.
Предпосылки
Прежде чем вы сможете начать использовать эти определения TypeScript в своем проекте, вам необходимо убедиться, что ваш проект соответствует нескольким из этих требований:
Использовать TypeScript v2.x
Включает определения TypeScript для node. Вы можете использовать npm для установки этого, введя следующее в окно терминала:
npm install --save-dev @types/node
В вашем tsconfig.json
или jsconfig.json
включены "dom" и "es2015.promise" в compilerOptions.lib. См. tsconfig.json
для примера.
В браузере
Чтобы использовать файлы определения TypeScript с глобальным объектом AWS в интерфейсном проекте, добавьте следующую строку в начало вашего файла JavaScript или TypeScript, где вы собираетесь использовать его, или добавьте его в типы tsconfig ' или файл деклараций:
/// <reference types="aws-sdk" />
Это обеспечит поддержку глобального объекта AWS.
Предыдущий ответ
Я обнаружил, что если я добавил
{ src: 'aws-sdk/dist/aws-sdk', inject: 'libs' }
для дополнительных_данных в файле project.config.ts(если используется angular2 -seed) или просто добавьте
<script src="/node_modules/aws-sdk/dist/aws-sdk.js"></script>
на ваш index.html
Тогда я мог бы добавить
declare const AWS: any;
Для любого из файлов .ts, которые мне нужны, у меня есть доступ к объекту AWS.
Не уверен, что это хорошее решение.
Ответ 2
Но он продолжает говорить мне, что модуль не существует.
TypeScript не знает о модуле, и кажется, что хороших определений не существует. Быстрое исправление:
declare module 'aws-sdk' {
var foo:any;
export = foo;
}
Затем вы можете сделать
import * as AWS from 'aws-sdk',
Ответ 3
Я также пытаюсь использовать aws-sdk с проектом angular 2 (angular cli generated). Я не смог загрузить libs правильно в браузере.
в соответствии с angluar doc я был импортирован libs (https://github.com/angular/angular-cli/wiki/3rd-party-libs#adding-underscore-library-to-your-project).
это выглядит так:
изменить package.json для загрузки JS файла из NPM в локальную систему
{
...
"dependencies": {
"aws-sdk": "git://github.com/aws/aws-sdk-js.git#support/typescript"
},
...
}
редактировать angluar-cli-build.js для копирования файлов aws JS во время процесса сборки в папку поставщика dist
var Angular2App = require('angular-cli/lib/broccoli/angular2-app');
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
...
'aws-sdk/**/*.js'
]
});
};
отредактируйте раздел карты в system-config.ts для сопоставления пространства имен в файл назначения
const map: any = {
'aws-sdk': 'vendor/aws-sdk/dist/aws-sdk.js'
};
в моем файле typescript я пытаюсь импортировать libs AWS.
...
import * as AWS from 'aws-sdk';
...
@Injectable()
export class MyService {
public myMethod() {
var s3 = new AWS.S3();
...
...
...
все это отлично подходит для компилятора typescript, исходный файл также загружается в браузере, но он приводит к ошибке, например: "S3 не является конструктором".
если вы отлаживаете материал, вы увидите, что материал AWS инициализирован, но после выполнения "import * as AWS из" aws-sdk "" var AWS инициализируется каким-то сумасшедшим объектом.
, поэтому мое решение:
изменить package.json для загрузки JS файла из NPM в локальную систему
{
...
"dependencies": {
"aws-sdk": "git://github.com/aws/aws-sdk-js.git#support/typescript"
},
...
}
редактировать angluar-cli-build.js для копирования файлов aws JS во время процесса сборки в папку поставщика dist
var Angular2App = require('angular-cli/lib/broccoli/angular2-app');
module.exports = function(defaults) {
return new Angular2App(defaults, {
vendorNpmFiles: [
...
'aws-sdk/**/*.js'
]
});
};
добавить импорт script в index.html
<script src="/vendor/aws-sdk/dist/aws-sdk.js" type="text/javascript"></script>
окончательно используйте его в своем сервисе
// make AWS as 'any' available for typescript compiler
declare var AWS:any;
@Injectable()
export class MyService {
public myMethod() {
var s3= new AWS.S3();
...
...
...
Это смешанный путь. Используйте процесс сборки Angluar 2, используйте управление пакетами NPM, но не используйте определения типов AWS typescript.