LINUX.ORG.RU
ФорумTalks

JS везде, но без Node.js

 , ,


0

2

Вот основная плюшка ноды якобы в том что можно писать RIA (для лоровцев: пердящие и бибикающие сайтики перегруженные жсом) на одном языке и на клиенте и на сервере.

Внимание вопрос: почему не юзать ту же яву с js движком? Ведь под нее дофига готовых либ, серверов и инструментов и многопоточность нормальная. Если пилить логику на js никто и не заметит разницы.

Deleted

Ты очередной путающий Java и JavaScript? Как ты собираешься связывать между собой логику на JS и либы на Java? Святым Духом? Синей изолентой? Через JNI?

Или я чего то не понял в твоем вопросе? Связь между мордой и серверной частью на Java давным давно работает через http реквесты и AJAX.

TheKnight ★★★
()

1) Проект по использованию библиотек ноды со встроеным интерпретатором в JDK вроде был, кажись Avatar.js

2) Голая скорость выполнения V8 сравнима с JVM. Множество процессов ноды жрут памяти приблизительно столько же сколько множество потоков с JS интерпретатором в JVM.

3) Аргумент «Java программисты зная только Java смогут этим пользоваться» не сработает, нужно все равно будет знать JS.

4) Это нормально использовать разные платформы в разных процесах. Если есть желание использовать ноду в качестве app сервера и другие сервисы, например для работы с Hadoop/HDFS/Spark писать на Java - почему бы и нет? Главное протокол, например Protobuf

vertexua ★★★★★
()
Ответ на: комментарий от fjfalcon

Многие среди тех полтора деклассированных элементов из всего количества пишущих RIA? Вполне может быть, почему нет.

redhat
()

почему не юзать ту же яву с js движком?

К примеру первый раз слышу что у явы есть движек для js. С явой надо ещё разобраться как его использовать да и яву знать надо наверное в таком случае, ноду проще развернуть. Простота залог успеха.

Основная идея наверное в том что тонны народу уже знают js, а нода только предоставляет API для работы на серверной стороне вот и всё.

почему не юзать ту же яву с js движком? Ведь под нее дофига готовых либ

Под ноду тоже уже овердохрена модулей.

P.S. Меня особо серьёзно не слушать, это всё IMHO.

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)
Ответ на: комментарий от vertexua

тут аргумент не в ява программистах а в отлаженности платформы и инструментов, а яву фактически знать не нужно - ну только на том уровне чтобы понимать что там написано в javadoc

Deleted
()

Внимание вопрос: почему не юзать ту же яву с js движком?

Например в geoexplorer используют rhino.
Трудно сказать, что конкретно тебе мешает...

special-k ★★★
()
Ответ на: комментарий от Deleted

но при виде лапши коллбеков нодовских все равно зовут маму

loki_ ★★
()
Ответ на: комментарий от TheKnight

А как делают бинды JavaScript к C/C++? Так же и с явой, с учетом того, что реализация JavaScript будет написана на Java (наверное, ТС имел ввиду это).

Meyer ★★★★★
()

Пиши, кто тебе мешает. Я для интереса запускал компилятор CoffeeScript под Nashorn. Вроде работало. И скорее всего заработает большинство либ не завязанных на нодовский апишник.

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Вот код сервлета, раздающего js клиенту.

/**
 *
 * Created by Antony on 22.11.2014.
 */
public class CoffeeServlet extends HttpServlet {

    protected Logger log = LoggerFactory.getLogger(getClass());

    protected Map<String, CacheEntry> scriptsCache = new ConcurrentHashMap<>();

    protected ScriptEngine engine;

    protected final Invocable compiler;

    protected String compilerSource;

    public CoffeeServlet() {
        ScriptEngineManager engineManager = new ScriptEngineManager();
        engine = engineManager.getEngineByName("nashorn");

        try (InputStream is = getClass().getResourceAsStream("/coffee-script.js")) {
            compilerSource = IOUtils.toString(is);
            engine.eval(compilerSource);

            String compileFunctionSrc = "function compile(cSource) { return CoffeeScript.compile(cSource); }";
            engine.eval(compileFunctionSrc);

            compiler = (Invocable) engine;
        } catch (IOException e) {
            log.error("=====> Error loading coffee script compiler source.", e);
            throw new ExceptionInInitializerError("Error loading coffee script compiler source.");
        } catch (ScriptException e) {
            log.error("=====> Error evaluating coffee script compiler.");
            throw new ExceptionInInitializerError("Error evaluating coffee script compiler.");
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/javascript");
        if (!scriptsCache.containsKey(req.getPathInfo())) {
            try (InputStream is = req.getServletContext().getResourceAsStream("/resources/cs" + req.getPathInfo())) {
                if (is != null) {
                    String source = IOUtils.toString(is);
                    String result;
                    synchronized (compiler) {
                        result = compiler.invokeFunction("compile", source).toString();
                    }

                    scriptsCache.put(req.getPathInfo(), new CacheEntry(Instant.now(), result));

                    resp.getWriter().write(result);
                } else {
                    resp.setStatus(404);
                    resp.getWriter().write("Cannot find resource: " + req.getPathInfo());
                }
            } catch (NoSuchMethodException | ScriptException e) {
                throw new ExpectedException("Error compiling coffee script to js. Request path is: " + req.getPathInfo(), e);
            }
        } else {
            try {
                URL resource = req.getServletContext().getResource("/resources/cs" + req.getPathInfo());
                if (resource != null) {
                    File f = new File(resource.toURI());
                    Instant lm = Instant.ofEpochMilli(f.lastModified());
                    if (lm.isAfter(scriptsCache.get(req.getPathInfo()).lastCompiled)) {
                        try (InputStream is = req.getServletContext().getResourceAsStream("/resources/cs" + req.getPathInfo())) {
                            String source = IOUtils.toString(is);
                            synchronized (compiler) {
                                scriptsCache.get(req.getPathInfo()).contents = compiler.invokeFunction("compile", source).toString();
                            }
                        } catch (NoSuchMethodException | ScriptException e) {
                            throw new ExpectedException("Error compiling coffee script to js. Request path is: " + req.getPathInfo(), e);
                        }
                    }
                    resp.getWriter().write(scriptsCache.get(req.getPathInfo()).contents);
                } else {
                    resp.setStatus(404);
                    resp.getWriter().write("Cannot find resource: " + req.getPathInfo());
                }
            } catch (URISyntaxException e) {
                //Do nothing here. Will newer happen
            }
        }
        resp.getWriter().flush();
    }

    private class CacheEntry {

        Instant lastCompiled;

        String contents;

        public CacheEntry(Instant lastCompiled, String contents) {
            this.lastCompiled = lastCompiled;
            this.contents = contents;
        }
    }

}

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

А уж почему создатели ноды написали свой велосипед над v8 вместо того, чтобы взять готовый явовский стек и инфраструктуру - это надо скорее у них спрашивать.

Nagwal ★★★★
()
Ответ на: комментарий от Meyer

cast uj2 с его крылатой «Латекс ты себе на член натягиваешь перед сексом, а LaTeX — это Латех!»

И что?

special-k ★★★
()
Ответ на: комментарий от Deleted

Писалось скоорее как proof of concept, на скорую руку. Ну и вообще копипаста меньше 3-5 строк копипастой не считается ;)

Nagwal ★★★★
()
Ответ на: комментарий от Nagwal

Ну и вообще копипаста меньше 3-5 строк копипастой не считается ;)

req.getPathInfo() - попадается 12 раз :o)

Deleted
()
Ответ на: комментарий от Deleted

кому то станет легче, если я в начале функции напишу String requestPath = req.getPathInfo(); и буду использовать переменную? Имхо разницы никакой.

Nagwal ★★★★
()

Я недавно читал, как человек скрестил react.js с nashorn и получил server-side rendering, аналогично node.js. Вроде всё работает.

А так — люди просто пилят либо не-RIA сайты на spring+jsp, либо пилят на каком-нибудь ангуляре сайт, а бэкэнд просто через REST доступен и забивают на индексируемость и прочую муть. Ну или тупо рендерят на сервере всю вёрстку и через AJAX высылают жаваскрипту, который тупо вставляет её на страницу. Приложения, которые и RIA и на сервере рендерятся, пока редкость.

Я считаю, что все эти жаваскрипты это для богатых вроде фейсбука, которые могут потратить миллиарды добра и нанять кучу крутых перцев. А обычным людям надо писать обычные сайты, в которых жаваскрипт может только слегка улучшать UX. Нет ничего плохого в перезагрузке страницы, если у тебя сервер не тормозит. А все эти одностраничные сайты это очень нишевой продукт, вроде gmail.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Nagwal

Имхо

Толсто. В любой команде тимлид должен отпинать за такой код.

Deleted
()
Ответ на: комментарий от Meyer

Нынешний nashorn называется, это развитие рино встроенное в jre с поддержкой всяких фич.

Deleted
()
Ответ на: комментарий от slyjoeh

Большинство js быдлокодеров «хелло ворлд» через пять коллбэков зачем-то вызывают, а на эксепшенах оно сжирает память... И ЧСХ, они сами НЕ ЗНАЮТ, зачем, т.к. накопали на стаковерфлоу, где все так делают.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от Legioner

и забивают на индексируемость и прочую муть.

Мне вот до сих пор интересно, нафига совершенно статический контент (ну пусть и хранимый в БД) на REST делать.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Ну очевидный ответ — чтобы разделить фронтэнд и бэкэнд. Это могут быть два разных проекта, которые друг про друга знают только REST-протокол и писать их могут две совершенно разные команды. А если мы статику встраиваем в отдаваемый HTML, это куда более тесное связывание бэкэнда и фронтэнда. Те же мобильные приложения обычно требуют REST-протокола, не HTML же им парсить.

HTML и связанные технологии, к сожалению, плохо продуманы. Тот HTML, который отдаёт сервер, выполняет слишком много задач. Это и семантическая структура для поисковика и нетрадиционных браузеров. Это и необходимая структура документа для применения к нему CSS-стилей, чтобы получить желаемый дизайн. Это и необходимая структура документа, чтобы с ней работал клиентский JavaScript, выполняя необходимые задачи. И это является источником многих проблем и неоптимальных решений.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Если есть желание писать сервачную часть на жаваскрипте, то есть ещё более «нормальное» решение: модуль к апачу или нжниксу.

Только таким путём бабла с инвесторов не выбить. Сравни «модуль к апачу» и «ПЛАТФОРМА».

ya-betmen ★★★★★
()
Ответ на: комментарий от Legioner

Что мешает накидать фронтенд на php???
В принципе, просто народ СНАЧАЛА плохо представляет, ЗАЧЕМ он пишет проект. А потом поздно.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Что мешает накидать фронтенд на php???

Наверное то что для этого надо сильно упороться.

Deleted
()
Ответ на: комментарий от ya-betmen

Тебе просто надо еще чуток подумать: он там никому не нужен, ну и далее:

Потому что на этом не пишут.

Все тебе надо разжевывать как ребенку малому, ей б-гу.

Deleted
()
Ответ на: комментарий от Deleted

Аналогия неуместна ибо брейнфак в разработке никому не нужен, ни в каком виде. А на ноде (читай жаваскрипте) люди всё таки что-то писать умудряются.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

люди всё таки что-то писать умудряются.

Очень тонко подмечено, что таки плачут колются и пишут.

Deleted
()
Ответ на: комментарий от Deleted

Если бы люди хотели притащить жаваскрипт на сервак по нормальному, то сделали бы модуль, дебаггер и прочее. Это хотя бы избавило тех, кто будет писать от калбаковской лапши и необходимости думать в четырёх измерениях. Но вместо этого все силы влили в ноду. в результате имеет то что имеем.

Но ведь это не повод притаскивать жаваскрипт на сервак через жаву.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Но ведь это не повод притаскивать жаваскрипт на сервак через жаву.

Ха, там есть и отладчик и профайлер и много других вещей (в т.ч. нормальная многопоточность).

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.