NetJS

Валерий Кузьмин, Kontur.Recognition, 2017

Проблема - надо писать 2 раза

  • Data Transfer Object
  • Валидации

Подходы

JS

JS

C#

C#

JS

node.js

edge.js

codegen

Open-source решения

  • JSIL - все что угодно, страшный JS
  • NetJS - с ограничениями, TS
    • namespaces
    • overloads
    • async
    • RegEx named groups

Автор NetJS о JSIL

"Then the world was blessed with JSIL. This is Project V done right. It's still a virtual machine vomitting all over your code, but it's a clean nice kind of vomit that is measured in megabytes instead of gigabytes"

private static ValidateInn(inn: string): List<ValidationResult>
{
    var list: List<ValidationResult> = new List<ValidationResult>();
    var flag: boolean = InnKppHelper.IsInnForIndividual(inn);
    var flag2: boolean = InnKppHelper.IsInnForLegalEntity(inn);
    if (flag || flag2)
    {
        if (!InnKppHelper.IsInnChecksumValid(inn))
        {
            var arg_5D_0: List<ValidationResult> = list;
            var validationResult: ValidationResult = new ValidationResult();
            validationResult.Field = MetaField.Inn;
            validationResult.Code = ValidationErrorLevel.Error;
            validationResult.Message = "Неверная контрольная сумма ИНН";
            arg_5D_0.Add(validationResult);
        }
    }
    ....
}

На выходе

Как это работает

Krec.Isomorphic.dll

public static bool ContainsOnlyNumbers(string str)
{
    return str != null && InnKppHelper.onlyNumberRegEx.IsMatch(str);
}

ILSpy

NRefactory

AST (C#)

Как это работает

AST (C#)

AST (TS)

CsToTs

Krec.Isomorphic.ts

TsOutputVisitor

Как это работает

Krec.Isomorphic.ts

guid.ts

mscorlib.ts

Готовая сборка

Архитектура

C#

DLL

TypeScript

JS

PROFIT!

NetJS

webpack

msbuild

???

Архитектура

C#

DLL

TypeScript

Fixed TS

JS

PROFIT!

NetJS

webpack

gulp

msbuild

???

1

2

(1) webpack: референсы

///<reference path='mscorlib.ts'/>

... my ts code ...
import {
    NObject,
    Exception,
    NArray,
    NNumber,
    NBoolean,
    ...
} from './mscorlib.ts';

(1) webpack: экспорты

class DocumentExtensions extends NObject ...
export class DocumentExtensions 
    extends NObject ...
+ enum, interface

(2) netjs: mscorlib.ts

class NString {
...
    static TrimEnd(str: string, trimChars: number[]): string
    {
	throw new NotImplementedException();
    }
...
}

(2) netjs: ES3

class Person {
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
class Person extends NObject {
    name: string;
    SetName(value: string): void
    {
        this.name = value;
    }
    GetName(): string
    {
        return this.name;
    }
}

tsc.exe -t ES3 mscorlib.es3.ts Library.ts --out Library.js

В итоге:

  • Кода стало меньше
  • Писать на JS сильно проще
  • Писать на C# чуть сложнее
  • Общая логика синхронизирована

Бонус: схема

{
    documents: [{...},{...}]
}
{
    documents: List<Document>
}

Runtime

Спасибо за внимание!

Вопросы?

Секретный слайд: маппер

  • https://github.com/kontur-recognition/Netjs
  • https://git.skbkontur.ru/recognition/claims/blob/master/gulp_scripts/isomorphic.js

mailto: vkuzmin@kontur.ru

telegram: malcoriel

netjs-at-frbr

By Valeriy Kuzmin

netjs-at-frbr

  • 672