Я пытаюсь создать небольшую библиотеку sdk, написанную в typescript. Моя идея состоит в том, чтобы создать проект, который будет содержать много файлов ts, которые скомпилируются в один js, и моя библиотека может иметь доступ, например foo.bar.myPublicClasses
Самое большое замечание Я не хочу использовать его на простых html-страницах, моя среда - это Dynamics CRM, поэтому включение JavaScript не выполняется в обычном теге html script include, а загрузка JavaScript выполняется в асинхронном режиме со структурой сборки от Dynamics CRM. Поэтому мне нужно связать мою библиотеку с одним файлом. Поэтому для резюме мне нужен один связанный js файл без каких-либо зависимостей с d.ts файлом, чтобы он мог быть повторно использован в других файлах typescript. Дополнительно для запуска моего js-кода из Dynamics CRM мне нужна любая глобальная функция, мой подход будет некоторой статической функцией в классе 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 файлы больше, как я бы написал свой код С# один файл для каждого класса и т.д.
Версия 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 файлы.
my tsconfig содержит модуль - commonjs, outputfile - myLibrary.js
Версия 2 Согласно документации typescript было бы лучше теперь использовать внешние модули, но я не уверен, что если скомпилированный 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);
});
И тогда мне нужно собрать мои требуемые модули, но я не знаю, как это сделать надлежащим образом.
my tsconfig содержит модуль - amd, outputfile - myLibrary.js
Я предполагаю, что для выполнения своей библиотеки я должен gulp или какой-либо другой инструментарий, но может ли кто-нибудь дать мне несколько советов или как это сделать?
это мой tsconfig.json, и он пересылает только один файл js
{
"compilerOptions": {
"module": "amd",
"target": "es5",
"sourceMap": true,
"outFile": "../public/js/yourfile.js"
},
"exclude": [
"node_modules",
"typings"
]
}