
Sergey
04.03.2017
14:33:33
ну то есть контракт неявный выходит
и только
есть масса языков где контракты неявные

Aleh
04.03.2017
14:34:03
А есть меинстрим язык с явными?

Google

Sergey
04.03.2017
14:34:19
ну java-like
python, ruby, golang - неявно
по сути - duck typing

Aleh
04.03.2017
14:34:33

Sergey
04.03.2017
14:34:42
если у модуля есть функция такая-то значит подходит
и у тебя по сути late binding)

Aleh
04.03.2017
14:35:20
import export в js в компайл тайме ж

Sergey
04.03.2017
14:35:37
в языках типа java ты тоже обычно конфиг контейнера правишь и потом перезапускаешь апу
да даже в php
мне надо дапнуть новый контейнер
так что в целом разница не большая, просто тебе надо подменить какой модуль вернется на самом деле

Google

Aleh
04.03.2017
14:36:54
Суть скорее не в том, что я подменять после запуска аппы хочу, а то, что я модули сами не трогаю
Достаточно поправить конфиг или мэин

Paul
04.03.2017
14:37:22

Aleh
04.03.2017
14:37:33
Делаем вид, что он везде работает)
Кстати вопрос с тем, как в ноде можно будет контролить резолвер для esm интересен

Paul
04.03.2017
14:38:57
на клиент всегда компиляция будет, так что пофиг

Aleh
04.03.2017
14:39:04
Это да

Paul
04.03.2017
14:39:11
точнее минификация и байдлинг

Sergey
04.03.2017
14:39:41
во всяком случае при таком раскладе разницы на самом деле никакой
а вот если не можешь подменить - тогда у тебя проблемы)
тогда надо вводить какие-то модули которые решают что юзать.... что опять же приводит нас к разруливанию зависимостей в рантайме что я считаю чем-то нехорошим (потому что сложно)

Aleh
04.03.2017
14:40:58
То совсем хорошо
Но вот есть сейчас яп, в котором конфиг резолва сделан каким-то стандартным способом и все тулзы подхватывают project-specific настройки?

Paul
04.03.2017
14:43:32
Эм. Я зачем?
Для ide это важным быть не должно, а во время выполнения можешь крутить require в js как угодно

Sergey
04.03.2017
14:44:06

Paul
04.03.2017
14:44:16
нет

Google

Aleh
04.03.2017
14:44:17

Paul
04.03.2017
14:44:28
Ты же тут заливаешь про интерфейсность модулей

Aleh
04.03.2017
14:44:29
В линте проверить соответствие типов

Paul
04.03.2017
14:44:36
Никаких конкретных реализаций

Aleh
04.03.2017
14:45:03
И какому он должен соответствовать?

Paul
04.03.2017
14:45:39
Такому, который ты где-то описал. Ты ведь его описал, чтобы любой мог свою реализацию написать, верно?

Aleh
04.03.2017
14:46:09

Paul
04.03.2017
14:46:38
Не знаю умеет ли какой линтер смотреть в module.exports, но запилить это не проблема

Sergey
04.03.2017
14:47:09

Paul
04.03.2017
14:47:12
мб можно с внешней стороны попробовать: const a: IModule = require('a'), но не думаю, что прокатит хотя бы у кого-то

Aleh
04.03.2017
14:47:22
Так а в module.exports чего?

Paul
04.03.2017
14:47:23
commonjs объект там

Aleh
04.03.2017
14:47:45
Возьмем для простоты esm
Там все статическое

Paul
04.03.2017
14:48:00
нет, простота это commonjs
Так что бери его, если хочешь

Aleh
04.03.2017
14:48:06
Там динамика

Google

Aleh
04.03.2017
14:48:13
Там непросто)

Paul
04.03.2017
14:48:20
Это неважно. После инициализации там всё как обычно
Там как раз просто, нет никаких default

Aleh
04.03.2017
14:48:47
Как статически проверить соответствие?

Paul
04.03.2017
14:48:49
В любом случае, никто не мешает перегнать в commonjs, а его чекать указанным образом

Aleh
04.03.2017
14:48:57

Paul
04.03.2017
14:49:00

Aleh
04.03.2017
14:49:00
С дефолт

Sergey
04.03.2017
14:49:20

Admin
ERROR: S client not available

Paul
04.03.2017
14:49:21
Это ещё одна концепция, в терминах commonjs невыразимая.

Aleh
04.03.2017
14:49:37
Это проблемы cjs

Paul
04.03.2017
14:49:38
концепции default нет нигде
А если сборщик узнает (посредством плагина) о том, как ты резолвишь, то и в компайлтайме можно
Для какого-нибудь webpack-а раз плюнуть написать
Если не ошибаюсь, для browserify был какой-то способо даже перезаписать через конфиг

Sergey
04.03.2017
14:51:28

Google

Paul
04.03.2017
14:51:47
А что там за резолвом тебя волновать не должно

Sergey
04.03.2017
14:51:55
ну то есть не совсем так

Paul
04.03.2017
14:52:09
Тогда у тебя нет и контрактов

Sergey
04.03.2017
14:52:10
они у тебя есть
но неявные

Paul
04.03.2017
14:52:20
И как они описаны?

Sergey
04.03.2017
14:52:21
типа
const foo = require('foo');
вот

Paul
04.03.2017
14:52:36
И что?

Sergey
04.03.2017
14:52:37
точнее даже так
import {doStuff} from 'foo'
вот мой "контракт"

Paul
04.03.2017
14:53:10
Эм. Это просто интерфейс

Sergey
04.03.2017
14:53:11
должен быть метод doStuff который делает то что мне нужно

Paul
04.03.2017
14:53:14
что есть какой-то doStuff

Sergey
04.03.2017
14:53:23

Paul
04.03.2017
14:53:28
Разве что в каких-то adga

Sergey
04.03.2017
14:53:44