2017-08-01 59 views
5

我試圖建立在打字稿中寫入的小sdk庫。我的想法是創建一個項目,將包含編譯成一個JS許多TS文件和我的媒體庫可以像foo.bar.myPublicClasses建立與打字稿的小sdk到一個js文件

訪問 我不想用它簡單的html頁面

最大此言一出,我的環境是Dynamics CRM,因此包括JavaScript在內的標準HTML腳本包含標記中沒有完成,並且加載JavaScript是使用Dynamics CRM的構建框架異步完成的。所以這就是爲什麼我需要將我的庫綁定到一個文件。 因此,總結我需要一個捆綁js文件沒有任何依賴d.ts文件,所以它可以在其他打字稿文件重用。 另外從運行動態CRM我需要的任何全局函數我的js代碼,我的做法是對類foo.bar.mylibrary.sdk.create()一些靜態函數

我的項目結構看起來是這樣的:

 

src/ 
|-bundle.ts 
|-classes/ 
| |-classA.ts 
| |-classB.ts 
| 
|-interfaces/ 
| |-IInterface1.ts 
| -IInterface2.ts 
| 
|-Helpers/ 
| |-HelperA.ts 
| |-HelperA.ts 
| 
dist/ 
| -myLibrary.js 

我想有.ts文件更像我會寫我的C#代碼每班等

版本一個文件1個 我最初的方法是使用命名空間,但我不知道,如果那將是長遠項目中最好的方式。在apporach我寫我的名字空間的所有TS文件只有一個不好的氣味對我來說,在合併js文件每個TS文件會寫

//a.ts 
namespace foo.bar.mylibrary{ 
    class a { 
     isOk:boolean; 
    } 
    export class b { 
     constructor(){ 
      let test = new a(); 
      test.isOk = false; 
     } 
    } 
} 
//b.ts 
namespace foo.bar.mylibrary{ 
    export class sdk{ 
     public isStart:boolean; 
     public static Create(){ 
      //initialize my sdk 
     } 
    } 
} 

編譯成

"use strict"; 
// b.ts 
var foo; 
(function (foo) { 
    var bar; 
    (function (bar) { 
     var mylibrary; 
     (function (mylibrary) { 
      var a = (function() { 
       function a() { 
       } 
       return a; 
      }()); 
      var b = (function() { 
       function b() { 
        var test = new a(); 
        test.isOk = false; 
       } 
       return b; 
      }()); 
      mylibrary.b = b; 
     })(mylibrary = bar.mylibrary || (bar.mylibrary = {})); 
    })(bar = foo.bar || (foo.bar = {})); 
})(foo || (foo = {})); 
var foo; 
(function (foo) { 
    var bar; 
    (function (bar) { 
     var mylibrary; 
     (function (mylibrary) { 
      var sdk = (function() { 
       function sdk() { 
       } 
       sdk.Create = function() { 
        //initialize my sdk 
       }; 
       return sdk; 
      }()); 
      mylibrary.sdk = sdk; 
     })(mylibrary = bar.mylibrary || (bar.mylibrary = {})); 
    })(bar = foo.bar || (foo.bar = {})); 
})(foo || (foo = {})); 

也許有到更好的辦法編譯這些ts文件。

我tsconfig包含模塊 - CommonJS的,OUTPUTFILE - myLibrary.js

2版 根據打字稿文檔它會更好,現在使用外部模塊,但我不知道是否編譯JS是什麼我會看到沒有導出的類被編譯爲簡單的var對象和導出的類都在定義的函數中。

//a.ts 
    class a { 
     isOk:boolean; 
    } 
    export class b { 
     constructor(){ 
      let test = new a(); 
      test.isOk = false; 
     } 
    } 

//b.ts 

    export class sdk{ 
     public isStart:boolean; 
     public static Create(){ 
      //initialize my sdk 
     } 
    } 
//build.ts 
export {sdk} from "./src/b"; 

編譯成

define(["require", "exports", "./src/classb"], function (require, exports, classb_1) { 
    "use strict"; 
    function __export(m) { 
     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 
    } 
    Object.defineProperty(exports, "__esModule", { value: true }); 
    // export * from "./src/classa"; 
    __export(classb_1); 
}); 

然後我需要捆綁我需要的模塊,但我不知道該怎麼做,在適當的方式。

我tsconfig包含模塊 - AMD,OUTPUTFILE - myLibrary.js

我想完成我的圖書館我應該吞下或一些其他的工具包,但任何人都可以給我一些提示或如何做到這一點?

+0

是您output.js文件中加載客戶端的一個動態CRM窗體或正在運行它通過節點的服務器端(或其他)? –

+0

只在客戶端 – ANDyW

回答

0

這是我tsconfig.json,它只是transpiles到一個js文件

{ 
    "compilerOptions": { 
    "module": "amd", 
    "target": "es5", 
    "sourceMap": true, 
    "outFile": "../public/js/yourfile.js" 
    }, 
    "exclude": [ 
    "node_modules", 
    "typings" 
    ] 
} 
+0

就像我寫在我的問題和張貼的例子,我知道如何編譯TS到一個JS與tsconfig,但它使用幾乎完美版本1,當我使用命名空間,與外部模塊編譯爲只導出類定義。 – ANDyW