-
Notifications
You must be signed in to change notification settings - Fork 22
Рендеринг приложения в nodejs #264
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Может начать собирать Noscript через Browserify? Тогда каждый файл будет отдельным CommonJS модулем и, как следствие, (1) не придется оборачивать каждый файл в IIFE, (2) не придется помнить, что в выражении var ns = ns || require('ns'); первая часть для браузера, а вторая для сервера.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А напиши пример, пожалуйста.
К примеру, как будет выглядеть такой вот файл в терминах Browserify:
var ns = ns || require('ns');
ns.coolMethod = function() {
return 'cool';
};There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вообще, в случае вспомогательной функции или класса, можно не прикреплять его к неймспейсу в самом модуле (чтобы без побочных эффектов):
// cool-method.js
var COOL = 'cool';
module.exports = function coolMethod() {
return COOL;
};
// ns.js
var ns = {};
ns.coolMethod = require('./cool-method');
module.exports = ns;Но если без сильных изменений, то можно записать так:
var ns = require('./ns');
module.exports = ns.coolMethod = function() {
return 'cool';
};There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Хм хм хм )
Ну может быть и стоит сделать как ты предлагаешь.
/сс @doochik @edoroshenko ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я за.
И уж точно не стоит писать везде no || require('nommon')
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
да, browserify решает эту проблему
Еще вот такая запись var no = no || require('nommon') не даст нам исполнять код в браузере или сделать модуль, потому что получится вот так
(function() {
// и тут всегда будет вызываться require, потому что no определен локально
var no = no || require('nommon');
})()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ну не надо это делать внутри замыкания просто
https://github.com/yandex-ui/noscript/blob/server.render.92/src/ns.view.js#L1-L2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Мы сами оборачиваем эти файлы в модули и такие строки все сломают
|
Давайте относиться к этому pr, как к прототипу. Я здесь пока вижу "решение по-быстрому". Хочется сделать ровно. Я тоже готов сделать заход |
|
Это полноценное решение вообще-то. |
|
Ром, ну давай по-честному, ты просто запустил ns в ноде и навтыкал костылей, чтобы оно завелось. Я считаю такой подход не очень правильным |
|
Приведи пример костыля? |
|
Примеры костылей: |
|
Ну ок, если ты придумаешь более элегантный способ - я не против. |
|
Я начал свой заход на серверный ns и теперь могу внести в свою позицию немного конструктива. @chestozo , ты решил задачу "сделать так, чтобы ns как-то заработал на сервере". Ты её успешно решил. Это proof of concept, прототип, но не рабочее решение. Создание рабочего решения требует более глубокой проработки и проектирования. Как я вижу правильный подход к решению этой задачи.
Естественно, это только первый подход к снаряду. Следующие шаги, которые я планирую: вникнуть в задачу поглубже, написать тесты, придумать и обсудить api, декомпозировать задачу. |
чтобы на сервер не клиентский код. Либо ты его не тащишь на сервер, либо ты втыкаешь костыли, чтобы он не ломался (if !window итд).
Это же разные окружения. В ноде нет window, location, history, dom, document. Это же очевидно. Это точно нужно перечислять? Я прелагаю выделить 3 типа сущностей noscript:
Первый проще, второй - ровнее. Пока писал этот коммент, придумал третье окружение: тестовое. Нам в бою ни на клиенте, ни на сервере не нужны костыли |
Друг, не воспринимай это на свой счёт. Мы все хотим сделать хороший инструмент. Этого можно достичь только дискуссией |
|
Я думаю, что явно очерченные сборки особо не нужны, они сами органично сформируются. Предлагаю, с точки зрения Node.js, рассматривать Noscript как набор компонентов (модулей). Да, для браузерного окружения есть клей в виде Идея с разделением |
Это как? ) |
|
Если подключить Browserify, то клиентский Серверный клей (типо такой) будет подключать |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
откуда в ns завязка на descript? А если я не хочу descript, а хочу express ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no.de надо читать как node, а не как no.descript.
Это свойство из nommon.
Зависимости от descript - нет )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А ещё лучше - вообще не использовать проверки и писать код, не зависящий от окружения.
Вот не знаю, утопия это в наших обстоятельствах, или нет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@maksimr при желании, и эта проверка не будет работать, если в браузере нужный json-чик забацать )
Но и window можно и в nodejs объявить )
В общем - мы все умрём )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@edoroshenko +1
@chestozo Я написал потому, что столкнулся с проблемами при созаднии yate-playground :)
|
Мое мнение:
|
Я вначале так и сделал, а потом переделал назад.
Вот тут не очень понял, что такое |
|
Это нужно решать не через добавление опций к сложному сценарию, а через разделение сценария на отдельные простые, которые потом можно комбинировать в зависимости от окружения.
Не нужно выполнять на сервере специфично клиентский код только из-за того, что нам лень придумывать, как его отделить.
его тесты будут контролировать |
|
@edoroshenko не будем, |
|
@doochik а зачем вообще создавать объект ns.action? |
|
Я кстати, не две сборки хочу, а три. Ещё для тестов ) |
|
Это не правильно, надо тестировать то, что уходит в браузер, а не какую-то специальную сборку |
|
Вот есть nommon, которые используется в nodejs и в браузере. |
|
я хочу в неё перенести только костыли |
|
Нужно из множества работающих схем выбрать оптимальную |
|
@edoroshenko можно, но тогда все настоящие приваты придется вынести наружу. Но и тогда кастомная сборка не нужна, а просто в стабах все написать можно |
|
@doochik да, всё в стабах |
|
предлагаю встречу, а то у меня пальцы устали |
|
Парни, давайте я сделаю заход и тогда уже соберёмся и обсудим конкретные решения. А то я пока только критикую и ничего своего не предложил. Я хочу другой api |
|
Давай все же, как ты любишь, мы сначала поговорим
|
|
И еще: давайте все споры про встраивание в node, browserify и т.п. оставим на конец. Сначала надо сделать вот эти 4 шага Потом, уже с готовым решением, проще будет понять че и как делать с нодой |
|
Про разбиение на 4 шага: это неполная картина. Шаги такие:
Под рендером я понимаю: html + DOM + events. |
|
Я тоже за встречу. |
|
Если что - вот тут есть пример, как вызывать descript в nodejs https://github.com/pasaran/yate/blob/master/docs/quick-start.md#%D0%92-nodejs |
|
Распилил ns.Update #304 |
|
Закрываю, раз есть отдельное issue на распил. |
Изменения API:
ns.tmplтеперь возвращает строку. До сих пор он возвращал DOM ноду, но у нас нет DOM-а на сервере (он нам и не нужен)ns.updateтеперь поддерживаетoptions.syncOnly(выполнить update только для синхронных видов) иoptions.renderOnly(результатом update-а должна стать HTML строка)Особенности работы:
ns.tmplиns.http, к примеру, так https://github.com/chestozo/noscript-demo/blob/master/server.js#L20-L49Пример:
допилил своё демо приложение https://github.com/chestozo/noscript-demo/
А ещё я хочу сказать вот что:
ns.updatewindow,document,location). И вообще все глобальные объекты должны быть доступны в nodejs и их нужно передавать в yate, как тут https://github.com/chestozo/noscript-demo/blob/master/server.js#L24<div id="ns-root"> ... </div>. Но это делается на стороне приложения, а не noscriptns.updatesyncMode: true- чтобы все view считались синхронными и все данные запрашивались тоже синхронной пачкой. Пока не делал.