2016-01-12 3 views
4

Я разрабатываю библиотеку для использования в веб-браузере с использованием TypeScript.Связать библиотеку машинописных файлов с одним файлом .js и одним .d.ts

Я пишу отдельные машинопись файлы в виде модулей, используя «систему», как --module, например, это основной файл:

/// <reference path="../typings/tsd.d.ts" /> 
/// <reference path="./typings/simple-html-tokenizer/simple-html-tokenizer" /> 

export * from "./Decorators/Component"; 
export * from "./Decorators/Directive"; 
export * from "./Decorators/Inject"; 
export * from "./Decorators/Injectable"; 
export * from "./Events/EventEmitter"; 
export * from "./Core/Bootstrap"; 
export * from "./Decorators/Output"; 
export * from "./Decorators/Input"; 
export {OnChanges, OnInit, OnDestroy} from "./Core/LifeCycle/LifeCycleHooks"; 

И это первый модуль:

import {serviceNormalize} from "../Utils/AngularHelpers"; 

export interface IComponentMetadata { 
    template?: string; 
    templateUrl?: string; 
    selector?: string; 
    directives?: Function[]; 
    outputs?: string[]; 
    inputs?: string[]; 
    styles?: string[]; 
    providers?: (Function|string)[]; 
} 

/** 
* Register metadata into class to be used by bootstrap. 
*/ 
export function Component(componentMetadata: IComponentMetadata) { 
    return (target: any) => { 

     /// ... 
     /// ... 
     /// ... 

     return target; 
    } 
} 

Ну, я строю его с помощью gulp-typescript, я перетаскиваю его на es5 и создаю один .js и один .d.ts файл за каждый файл .ts. Пока что так хорошо, у меня есть пакет npm, и я могу использовать свой проект из других проектов в npm. Но ...

Я хочу использовать его и из веб-браузера. Я хотел бы, чтобы связать все .js файлы в одном и использовать этот способ:

<script src="~/Scripts/Ng2Emulation-bundle.js"></script> 

Я формировала .d.ts файл, используя dts-bundle и я попытался связывайте .js файлы из двух способов:

  1. Использование CONCAT:

    gulp.src('dist/js/src/**/*.js') .pipe(concat('Ng2Emulation-bundle.js')) .pipe(gulp.dest('dist/release'));

  2. Использование tsify:

    browserify() .add('src/ng2emulation.ts') .plugin(tsify, { noImplicitAny: false }) .bundle() .on('error', function (error) { console.error(error.toString()); }) .pipe(gulp.dest("Ng2Emulation-bundle.js"));

Два способа создания сверток, но когда я пытаюсь использовать его из браузера он пытается загрузить каждый модуль, получать ошибки как:

GET http://localhost:55411/Utils/AngularHelpers.js 404 (Not Found)D @ system.js:4(anonymous function) @ system.js:4(anonymous function) @ system.js:4V @ system.js:5t.metadata.deps @ system.js:5r @ system.js:5n @ system.js:5r @ system.js:5(anonymous function) @ system.js:5(anonymous function) @ system.js:4 
system.js:4 GET http://localhost:55411/Templates/HttpInterceptor.js 404 (Not Found)D @ system.js:4(anonymous function) @ system.js:4(anonymous function) @ system.js:4V @ system.js:5t.metadata.deps @ system.js:5r @ system.js:5n @ system.js:5r @ system.js:5(anonymous function) @ system.js:5(anonymous function) @ system.js:4 
system.js:4 GET http://localhost:55411/Directives/NgProperty.js 404 (Not Found)D @ system.js:4(anonymous function) @ system.js:4(anonymous function) @ system.js:4V @ system.js:5t.metadata.deps @ system.js:5r @ system.js:5n @ system.js:5r @ system.js:5(anonymous function) @ system.js:5(anonymous function) @ system.js:4 
system.js:4 GET http://localhost:55411/Templates/HtmlParser/Parser.js 404 (Not Found) 

Я использую Visual Studio 2013 , приложение MVC ASP.NET. Мой главный HTML (_layout.cshtml) является, как это:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <link href="~/node_modules/angular-material/angular-material.css" rel="stylesheet"/> 
    <script src="~/Scripts/jquery-2.2.0.js"></script> 
    <script src="~/Scripts/angular.js"></script> 
    <script src="~/Scripts/angular-aria.js"></script> 
    <script src="~/Scripts/angular-animate.js"></script> 
    <script src="~/Scripts/angular-messages.js"></script> 
    <script src="~/node_modules/angular-material/angular-material.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.15/system.js"></script> 
    <script type="text/javascript"> 
     // set our baseURL reference path 
     System.config({ 
      baseURL: '/TypeScript', 
      map: { 
       "HTML5Tokenizer": "/Scripts/simple-html-tokenizer.js", 
       "Ng2Emulation": "/Scripts/Ng2Emulation-es5.js" 
      } 
     }); 
     System.defaultJSExtensions = true; 

     System.import('App/Boot'); 
    </script> 
</head> 
<body> 
    @RenderBody() 
    @RenderSection("scripts", required: false) 
</body> 
</html> 

И это мой App/Boot.ts:

import {bootstrap, Component} from "Ng2Emulation"; 

@Component({ 
    selector: "my-app", 
    template: "<h1>My First Angular 2 App</h1>" 
}) 
export class AppComponent { } 

bootstrap(AppComponent); 

Я пытался загрузить пакет с помощью: <script src="~/Scripts/Ng2Emulation-bundle.js"></script> и удалить Ng2Emulation карту от system.config но Мне не повезло :(

Я думаю, что есть что-то, что я не понимаю в процессе создания пакета или в модулях behaivor ...

Как связать его? Как я мог это сделать?

ответ

1

Да, после глубокого поиска я нашел один путь. Я нашел systemjs builder проект. я написал задачу в моем файле глоток, таким образом:

gulp.task("system-builder", function() { 
    var builder = new Builder('dist/js/src'); 

    builder.config({ 
     meta: { 
      'HTML5Tokenizer.js': { // HTML5Tokenizer is a external módule 
       build: false  // Not to include in a bundle. 
      } 
     }, 
     defaultJSExtensions: true 
    }); 

    builder 
     .bundle('Ng2Emulation.js', 'dist/release/Ng2Emulation-bundle.js') 
     .then(function() { 
      console.log('Build complete'); 
     }) 
     .catch(function (err) { 
      console.log('Build error'); 
      console.log(err); 
     }); 
}); 

Я обнаружил, что смотрит на глоток файлах Angular2: D Теперь я могу включить файл с помощью HTML script тега, мой HTML таков:

<script src="~/Scripts/simple-html-tokenizer.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.15/system.src.js"></script> 
<script type="text/javascript"> 
    // set our baseURL reference path 
    System.config({ 
     baseURL: '/TypeScript', 
     map: { 
      "HTML5Tokenizer": "/Scripts/simple-html-tokenizer.js" 
     } 
    }); 
    System.defaultJSExtensions = true; 
</script> 
<script src="~/Scripts/Ng2Emulation-es5.js"></script> 
<script type="text/javascript"> 

    System.import('App/Boot'); 
</script> 

Это работает как шарм.

Тем не менее, если кто-нибудь знает другие способы сделать, что я хотел бы знать. Я не понимаю, какая система мудула лучше, когда используется тот или иной, ...