Создайте небольшой SDK с машинописью в один файл JS

5

Я пытаюсь создать небольшую библиотеку 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 или какой-либо другой инструментарий, но может ли кто-нибудь дать мне несколько советов или как это сделать?

  • 0
    Ваш файл output.js загружается на стороне клиента в форме Dynamics CRM или он выполняется на стороне сервера через узел (или другой)?
  • 0
    только на стороне клиента

1 ответ

0

это мой tsconfig.json, и он пересылает только один файл js

{
  "compilerOptions": {
    "module": "amd",
    "target": "es5",
    "sourceMap": true,
    "outFile": "../public/js/yourfile.js"
  },
  "exclude": [
    "node_modules",
    "typings"
  ]
}
  • 0
    Как я написал в своем вопросе и опубликованном примере, я знаю, как скомпилировать ts в один js с помощью tsconfig, но он почти идеально работает только с версией 1, когда я использую пространства имен, а с внешними модулями он компилируется только в экспортируемый класс, как определено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню