Netjs-loader

Kontur.Recognition

Client

Server

DTO формы

DTO формы

Валидация формы

Валидация формы

Хэлперы

Хэлперы

Client

Server

DTO формы

DTO формы

Валидация формы

Валидация формы

Хэлперы

Хэлперы

Client

Server

DTO формы

Валидация формы

Хэлперы

Хэлперы

Хэлперы

C#

Подходы

JS

JS

C#

C#

JS

node.js

edge.js

codegen

Open-source решения для кодогена

  • JSIL - все что угодно, жирный JS
  • NetJS - с ограничениями, TS
  • TODO: написать про мертвый Project V
  • TODO: глянуть что еще есть сейчас
private static List<ValidationResult> ValidateInn(string inn) {
    List<ValidationResult> results = new List<ValidationResult>();
    bool isIndividual = InnKppHelper.IsInnForIndividual(inn);
    bool isInnForLegalEntity = InnKppHelper
        .IsInnForLegalEntity(inn);
    if (isIndividual || isInnForLegalEntity) {
	if (!InnKppHelper.IsInnChecksumValid(inn)) {
	    results.Add(new ValidationResult {
		Field = MetaField.Inn,
		Code = ValidationErrorLevel.Error,
		Message = 
                    "Неверная контрольная сумма ИНН"
	    });
	}
    }
}

На входе

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.Message = 
                "Неверная контрольная сумма ИНН";
            arg_5D_0.Add(validationResult);
        }
    }
}

На выходе

Кодоген: парсинг

Krec.Isomorphic.dll

ILSpy

NRefactory

AST (C#)

C# code

TODO

пример разбора выражения

C# -> AST

Кодоген: генерация

AST (C#)

AST (TS)

CsToTs

Krec.Isomorphic.ts

TsOutputVisitor

TODO

пример сбора того же выражения

C# AST -> TS

Ну сейчас заведется...

Krec.Isomorphic.ts

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

Нужен Runtime Lib!

TODO

примеры необходимых методов

Цельный бандл

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

???

2

1

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

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

... my ts code ...
import {
    NObject,
    Exception,
    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/TS сильно проще
  • Писать на C# чуть сложнее
  • Общая логика синхронизирована

TODO

пример усложнения для C#

Но этого было мало!

  • Зачем-то много стадий компиляции, тяжело продать другим командам
  • Костыли везде
  • Зачем-то сборка C# -> dll -> C#
  • Сложный watch
  • Компиляция всего предварительно а не по запросу
  • msbuild-ы дерутся между собой

TODO

netjs-loader

Когда это нужно вам?

  • Нельзя взять и написать все на node
  • Много общего кода
  • Надо быстро грузиться

TODO

что дальше?

TODO

контакты

netjs-at-dump

By Valeriy Kuzmin

netjs-at-dump

  • 565