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-ы дерутся между собой
Webpack loader
import {ValidateINN} from 'IsomorphicDocumentHelpers.cs'
Требования
- Сборка по запросу от webpack
- Генерация сразу "хорошего" TS
- Отсутствие необходимости в вызове msbuild и ILSpy
TODO: что получилось
TODO: с какими проблемами столкнулись
Когда это нужно вам?
- Нельзя взять и написать все на node
- Много общего кода
- Надо быстро грузиться
TODO
что дальше?
TODO
контакты
netjs-at-holy
By Valeriy Kuzmin
netjs-at-holy
- 623