1657885649
Во-первых, у нас есть JavaScript. Затем у нас появились одностраничные приложения. Потом у нас... заболела голова. Это потому, что наши красивые и очень интерактивные веб-приложения стали медленными и столкнулись с рядом проблем с удобством использования, затрагивающих как поисковых роботов, так и людей. Разработчики лихорадочно искали решения. Являются ли рендеринг на стороне сервера и создание статических сайтов ответом? Чтобы выяснить это, давайте взглянем на Next.js, одну из самых популярных платформ SSR/SSG.
В мире разработки программного обеспечения так много модных словечек, что, если бы я действительно захотел, я мог бы заполнить целую статью одним лишь длинным списком красивых терминов, встречающихся на перекрестке между программными технологиями и бизнесом.
Но SSR и SSG действительно выделяются. Они имеют подлинное и практическое значение для всех, кто занимается созданием программного обеспечения — от разработчиков до дизайнеров, специалистов по UX, тестировщиков, веб-аналитиков, экспертов по SEO, копирайтеров и многих других.
Преимущества умелого использования SSR и SSG имеют большое значение во всех этих областях. Если вы еще этого не знаете, я уверен, вы поймете это к тому времени, когда я закончу.
Сегодня вы получите практическую информацию о SSR и SSG. Я также собираюсь представить фреймворк, упрощающий их использование — Next.js.
Что это за статья:
Чем не является эта статья:
Пока я собираюсь углубиться в код, я делаю вещи доступными для более широкой аудитории. Я действительно хочу показать, как SSR и SSG связаны с потребностями бизнеса в современной разработке программного обеспечения.
Чтобы более четко понять необходимость SSR и SSG, давайте совершим большой прыжок в прошлое. Дождливый и холодный полдень 4 декабря 1995 года…
… Брендан Эйх как раз заканчивает работу над самой первой версией JavaScript. Он поставляется компанией Netscape как часть своего браузера Netscape Navigator.
JavaScript быстро завоевал популярность как язык сценариев на стороне клиента. В старые времена он в основном использовался для проверки формы и базовой интерактивности страницы на типичной HTML-странице. В последующие годы появились всевозможные новшества.
Во-первых, среда Node.js предоставила возможность использовать JavaScript на сервере в качестве полноценного внутреннего языка . Затем современные веб-фреймворки и библиотеки, такие как React или Vue.js, значительно расширили возможности JavaScript с точки зрения поддержки взаимодействия с пользователем. В результате разработчики могли создать веб-страницу или приложение, которые очень похожи на родные настольные и мобильные приложения . Они работали очень быстро и практически не требовали перезагрузки в браузере. Пользователям это понравилось. Разработчикам это понравилось, и они назвали это…
Нативная производительность сделала SPA популярными в современной веб-разработке того времени, но не все разделяли энтузиазм. Однозначно SPA не заслужили любви поисковых систем.
HTML-контент, отображаемый на стороне клиента, был доступен им только после того, как он был выполнен в браузере. В результате автоматические сканеры, отправленные поисковыми системами, пропустили большую часть этого. Это сделало SPA очень трудным для правильной индексации. В свою очередь, веб-сайты упустили большую часть своего органического трафика — большая проблема с точки зрения поисковой оптимизации. Как раз тогда, когда SEO действительно становилось популярным в первом десятилетии 21-го века…
Брендан Эйх был одним из ключевых людей на ранней стадии разработки JavaScript.
SSR и SSG — это два метода, которые развились в сообществе разработчиков программного обеспечения для решения именно этой проблемы. Кто они такие?
С помощью SSR вы можете отображать код JavaScript на сервере и отправлять индексируемый HTML-код пользователю. Таким образом, HTML-код генерируется во время выполнения , чтобы он мог одновременно достигать поисковых систем и пользователей.
До появления Next.js такой процесс требовал много настроек и сопровождался проблемами, связанными с нагрузкой на сервер, контентом по запросу, кэшированием или даже самой архитектурой приложения. Не поймите меня неправильно — это, безусловно, выполнимо, но было бы неплохо, если бы вместо этого можно было посвятить все это время разработке бизнес-логики…
Основное различие между SSR и SSG заключается в том, что в последнем случае ваш HTML создается не во время выполнения, а во время сборки . Такие веб-сайты работают очень быстро, поскольку HTML-контент обслуживается еще до того, как вы сделаете запрос. С другой стороны, веб-сайт необходимо перестраивать и полностью перезагружать каждый раз, когда вносятся изменения. Следовательно, веб-сайты на основе SSG гораздо менее интерактивны и нативны, чем те, которые полагаются на SSR. Это в основном статические сайты с небольшим динамическим контентом или без него.
Основная идея SSR и SSG
И SSR, и SSG имеют ряд важных преимуществ для бизнеса .
Легко индексируемые страницы дают ощутимые преимущества — больше органического трафика. Для веб-приложений, которые считают SEO стратегически важным для маркетинга и продаж, это может привести к увеличению прибыли и общей прибыли. Отчеты SEO-агентств подтверждают это — этот интернет-магазин улучшил свои продажи на 67% за счет увеличения органического трафика.
Исследование UX, проведенное Google , показывает, что показатель отказов увеличивается на целых 32%, если загрузка страницы увеличивается с 1 до 3 секунд . И SSR, и SSG сокращают время загрузки по сравнению с рендерингом на стороне клиента. Это потому, что SSR собирает все данные, не дожидаясь, пока браузер сделает такой запрос. SSG идет еще дальше, собирая все данные по мере создания приложения.
Выполняя большую часть тяжелой работы на сервере, а не в браузере, вы разгружаете клиентские браузеры и устройства. В результате SSR и SSG облегчают просмотр веб-приложения пользователям со старыми устройствами и более медленным подключением к Интернету. Это может быть особенно важно для конверсий на мобильных устройствах: целых 73 % мобильных пользователей боролись с медленной загрузкой веб-сайтов .
Я уверен, что к настоящему моменту вы уже видите преимущества SSR и SSG . Давайте узнаем, как вы можете реализовать их с помощью Next.js.
Страницы SSR генерируются при каждом запросе. Логика SSR выполняется только на стороне сервера. Он никогда не запускается в браузере.
Если вы экспортируете функцию с именем getServerSideProps со страницы, Next.js будет предварительно отображать эту страницу при каждом запросе, используя данные, возвращаемые getServerSideProps .
Метод getServerSideProps вызывается в двух случаях:
Функция getServerSideProps всегда возвращает объект с одним из следующих свойств:
Интересно, что Next.js утверждает, что весь код, используемый в getServerSideProps , должен быть удален из пакета клиента, чтобы вы могли создавать код, связанный с сервером и клиентом. Это не всегда так. Один неправильный импорт или зависимость, и объединение не будет работать должным образом. Чем проще структура вашего приложения, тем легче добиться правильного поведения.
Пример реализации:
import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next';
type Product = {
id: string;
title: string;
}
type SearchResultsPageProps = {
products: Array<Product>;
}
const SearchResultsPage = ({ products }: SearchResultsPageProps) => (
<div>
{products.map((product) => (<p key={product.id}>{product.title}</p>))}
</div>
)
export async function getServerSideProps({ res, query }: GetServerSidePropsContext): Promise<GetServerSidePropsResult<SearchResultsPageProps>> {
const category = query?.category;
if (!category) {
return {
redirect: {
destination: '/'
}
}
}
const data = await fetch(`http://external-api.com/products?category=${category}`);
const products = await data.json();
if (products.length === 0) {
return {
notFound: true
}
}
return {
props: {
products,
}
}
}
export default ProductsPage;
Как видите, это вполне объяснимо:
SSR рекомендуется для приложений, в которых вам необходимо предварительно отображать часто обновляемые данные из внешних источников. Этот метод особенно рекомендуется, когда данные не могут быть сгенерированы статически до того, как будет выполнен запрос пользователя, и в то же время они должны быть доступны для поисковых систем.
Пример? Страница результатов поиска или веб-сайт электронной коммерции, содержащий пользовательский контент.
На ССГ!
Страницы на основе SSG генерируются во время сборки. Вы можете повторно использовать (и перезагружать) всю страницу по каждому запросу.
Next.js выполняет предварительный рендеринг страниц с использованием статической генерации, что, среди прочего, означает, что он не извлекает никаких данных по умолчанию. Если вам нужно создать страницу, содержащую такие данные, у вас есть два сценария:
Метод getStaticProps всегда выполняется на сервере (а не на стороне клиента). Он собирает данные страницы для заданного пути. Метод вызывается в одном из трех случаев:
Я собираюсь рассмотреть два последних случая в разделе «Пошаговая статическая регенерация».
Метод getStaticProps всегда возвращает объект с одним из следующих свойств:
Что действительно важно, метод getStaticProps не имеет доступа к входящим запросам. Если вам нужен доступ к запросу, рассмотрите возможность использования некоторого промежуточного программного обеспечения, кроме getStaticProps, или рассмотрите вместо этого SSR. В режиме разработки getStaticProps вызывается при каждом запросе для лучшего взаимодействия с разработчиком.
Метод getStaticPaths будет выполняться только во время производственной сборки. Он не будет вызываться во время выполнения. Метод необходимо использовать вместе с getStaticProps . Его нельзя использовать с getServerSideProps .
Метод getStaticPaths всегда возвращает объект с любым из следующих свойств:
Next.js предоставил статическую регенерацию по запросу в версии 12.1. Это означает, что вы можете вручную очистить статический кеш для страницы, если ее содержимое было обновлено во внешнем источнике (например, CMS или базе данных). Эта функция дает вам возможность всегда доставлять актуальные данные без задержек и при этом сохранять статическую генерацию для данной страницы.
Пример реализации:
import { GetStaticPathsResult, GetStaticPropsResult, GetStaticPropsContext } from 'next';
type Post = {
id: string;
title: string;
}
type PostPageProps = {
post: Post;
}
const PostPage = ({ post }: PostPageProps) => {
return (
<p>{post.title}</p>
)
}
export async function getStaticPaths(): Promise<GetStaticPathsResult> {
const data = await fetch('http://external-api.com/posts');
const posts = await data.json();
return {
paths: posts.map(post => ({
params: { id: post.id }
})),
fallback: false,
}
}
export async function getStaticProps({ params }: GetStaticPropsContext<{ id?: string }>): Promise<GetStaticPropsResult<PostPageProps>> {
const data = await fetch(`http://external-api.com/posts/${params.id}`);
const post = await data.json();
return {
props: {
post,
},
}
}
export default PostPage;
Пример выше реализует второй из двух ранее упомянутых сценариев — когда пути зависят от внешних данных:
SSG рекомендуется использовать на любой странице, где вам необходимо предварительно отобразить данные. Он может быть сгенерирован до того, как будет выполнен запрос пользователя. Это означает, что ваши данные доступны во время сборки или, другими словами, на каждой странице, где вы хотите представить статический контент или предоставить отличные возможности SEO. Примерами таких страниц являются блоги или маркетинговые сайты, которые содержат данные из безголовой CMS, содержимое которых не очень часто обновляется.
Как видите, и у SSR, и у SSG есть свои плюсы и минусы. Вот почему вы также должны рассмотреть альтернативные решения.
После всего сказанного и сделанного можно подумать, что SSR и SSG исчерпывают все возможности переноса вашей рабочей нагрузки на сервер. Но разработчики действительно не могут ничего с собой поделать, но постоянно вводят новшества. Введите инкрементную статическую регенерацию!
Инкрементная статическая регенерация — одна из самых мощных функций Next.js. Это позволяет вам использовать статическую генерацию таким образом, чтобы вам не приходилось перестраивать всю страницу при каждой перезагрузке.
Инкрементная статическая регенерация является расширением статической генерации. Он предлагает дополнительное свойство, возвращаемое getStaticProps . Это свойство называется revalidate и считается в секундах. Свойство revalidate сообщает вам, как часто Next.js должен регенерировать статический HTML для данной страницы. Регенерация запускается по запросу пользователя, а не каждые «X» секунд. Это свойство должно быть настроено в зависимости от характера данных, которые вы хотите отображать на данной странице, таких как сообщения в блогах, продукты, данные, связанные с пользователями, маркетинговый контент.
ISR улучшает масштабируемость веб-приложений. Вы можете статически генерировать сотни самых популярных или последних сообщений во время сборки и включать ISR для остальных статей. Как только пользователь делает запрос на страницу, не указанную в getStaticPaths , Next.js выполнит серверную визуализацию страницы для этого пользователя и статически сгенерирует страницу в фоновом режиме. Следующий пользователь получит статически сгенерированный контент. Это сократит время сборки, сохранив все преимущества SSG для каждого поста в блоге. Представьте, сколько времени может занять сборка, если вы хотите предварительно отрендерить более 10 000 сообщений во время сборки!
Пример реализации:
import { GetStaticPathsResult, GetStaticPropsResult, GetStaticPropsContext } from 'next';
type Post = {
id: string;
title: string;
}
type PostPageProps = {
post: Post;
}
const PostPage = ({ post }: PostPageProps) => {
return (
<p>{post.title}</p>
)
}
export async function getStaticPaths(): Promise<GetStaticPathsResult> {
const data = await fetch('http://external-api.com/posts');
const posts = await data.json();
return {
paths: posts.map(post => ({
params: { id: post.id }
})),
fallback: 'blocking'
}
}
export async function getStaticProps({ params }: GetStaticPropsContext<{ id?: string }>): Promise<GetStaticPropsResult<PostPageProps>> {
const data = await fetch(`http://external-api.com/posts/${params.id}`));
const post = await data.json();
return {
props: {
post,
},
revalidate: 10, // In seconds
}
}
export default PostPage;
Вы получаете список сообщений для предварительного рендеринга в getStaticPaths так же, как и для SSG. Разница в том, что для резервного значения установлено значение blocking . Это означает, что когда пользователь посещает страницу, которая еще не сгенерирована статически, Next.js вернет контент после того, как для этой конкретной страницы будет выполнен серверный рендеринг. SSG будет выполняться в фоновом режиме для следующих пользователей.
В getStaticProps есть новое свойство, которому поручено возвращать объект, который называется revalidate . Он считается в секундах, поэтому Next.js будет предварительно отображать страницу при поступлении запроса, но не чаще одного раза в 10 секунд. Когда страница посещается только один раз в день, повторная проверка запускается один раз в день.
Другой альтернативой является рендеринг на стороне клиента, основанный на выборке данных на стороне клиента. В отличие от работы с API рендеринга на стороне сервера, выборка данных может выполняться на уровне страницы или компонента.
Извлечение данных на стороне клиента может негативно повлиять на производительность вашего приложения и скорость загрузки ваших страниц. Это связано с тем, что выборка данных выполняется, когда компонент или страница смонтированы, а данные не кэшируются.
Когда вы можете рассмотреть вопрос о корпоративной социальной ответственности?
Когда вы решите использовать SSR или SSG, всегда ли следует реализовывать их с помощью Next.js?
Next.js — это мощное решение, которое предлагает множество различных подходов к отображению ваших страниц. Поскольку он охватывает так много методов, вы можете легко настроить его в соответствии со своими требованиями. Вы можете использовать разные стратегии рендеринга или даже комбинировать их вместе.
Как понять, какой подход лучше? Вот несколько полезных вопросов, которые стоит задать себе:
Существует несколько комбинаций описанных выше сценариев. Поиск наилучшего баланса требует тщательного анализа вашего проекта.
Другая причина выбора Next.js проста и в то же время очень важна — Next.js чрезвычайно популярен . У него более 83 000 звезд на Github (больше, чем у любых других альтернатив) и большое сообщество. Кроме того, компания Vercel работает в фоновом режиме, обеспечивая непрерывную разработку и поддержку платформы Next.js. В совокупности вы получаете стабильную, яркую среду, которая никуда не денется.
Конечно, как и у любого другого фреймворка, у Next.js есть свои недостатки. Например, не так просто обмениваться статическим содержимым между несколькими экземплярами Next.js в производственной среде с помощью Docker. Тем не менее, гибкость Next.js позволяет относительно легко находить решения в случае изменения требований в проекте. Скорее всего, вам не нужно будет переходить на другое решение или платформу, чтобы добиться цели.
Гэтсби
Gatsby — это быстрый и гибкий фреймворк и генератор статических сайтов, который делает создание сайтов с помощью любой CMS или API очень приятным. Gatsby используется для создания веб-сайтов, которые генерируют статический HTML во время сборки. Впоследствии код можно хранить в CDN и распространять среди всех ваших пользователей по всему миру. Gatsby сочетает в себе лучшие элементы React и GraphQL, поэтому это настоящее удовольствие для разработчиков. Начиная с версии 4, Gatsby поддерживает SSR, что делает фреймворк еще более мощным. Более 52 000 звезд GitHub — свидетельство популярности Гэтсби.
Remix — это веб-фреймворк с полным стеком, который позволяет вам сосредоточиться на пользовательском интерфейсе. Он обеспечивает быстрый и удобный пользовательский интерфейс.
В Remix есть только два режима рендеринга — вы можете использовать SSR во время выполнения и CSR во время выполнения. Remix использует React для создания пользовательских интерфейсов. Он содержит вложенные маршруты, что означает, что вы можете запускать несколько маршрутов в одном представлении без каких-либо состояний загрузки. Ремикс стал популярным в последние несколько месяцев. Сообщество быстро растет. У него более 14 000 звезд GitHub .
Hexo — это инструмент на базе Node.js, который относится к категории SSG. Это быстро, просто и мощно. Он продается в первую очередь как фреймворк для блогов. Он анализирует ваши сообщения с помощью Markdown или другого механизма рендеринга, создавая статические файлы за считанные секунды. У него более 34 000 звезд на GitHub .
Поскольку дорожной карты для Next.js нет в открытом доступе (за исключением вех ), предсказать, как она будет выглядеть в будущем, не так-то просто. Но есть по крайней мере одна предстоящая функция, о которой действительно стоит упомянуть. На данный момент он доступен только в альфа-версии.
React 18 представляет компоненты React Server. На первый взгляд это звучит не так захватывающе, но становится лучше! Начнем с документов.
Короче говоря, серверные компоненты и их логика будут выполняться только на сервере. Они не будут подвергаться процессу гидратации. В результате вы получите свежесгенерированные статические фрагменты HTML. Естественно, серверные компоненты могут содержать дочерние компоненты клиента. Эти компоненты могут быть полностью интерактивными и отображаться в браузере.
Чтобы понять практические последствия, давайте снова обратимся к документации.
Несмотря на альфа-версию, серверные компоненты уже поддерживают некоторые API Next.js, включая next/link , next/image и next/document . Они также имеют доступ к маршрутизатору. Он вводится в компонент свойством маршрутизатора .
Компоненты сервера не имеют состояния, поэтому вы не можете использовать React Hooks как useContext , useState , useReducer или useEffect внутри этих компонентов. Кроме того, пока не поддерживаются такие функции, как i18n (интернационализация) или next/head .
На мой взгляд, серверные компоненты потенциально могут изменить способ использования фреймворка Next.js. Они могли бы заменить традиционные SSR. Их преимущества включают отправку меньшего количества JavaScript в браузер (меньше килобайт для загрузки) и ограничение процесса гидратации клиентскими компонентами. Оба должны улучшить взаимодействие с пользователем за счет повышения веб-производительности, особенно метрик « Время до первого байта» и « Задержка первого ввода ».
Все это звучит великолепно в теории, но я все же собираюсь дождаться официального релиза серверных компонентов, чтобы провести надлежащие испытания и принять решение о них. Я собираюсь обратить внимание на то, как они влияют на взаимодействие с пользователем, веб-производительность и существующие рабочие процессы Next.js.
Вот и все! Конечно, о SSR и SSG можно сказать гораздо больше. Тем не менее, это должно дать вам четкое представление о том, как это работает, чтобы сделать ваше приложение и ваш бизнес более эффективными. Ты знаешь что:
Если у вас есть опыт разработки программного обеспечения в качестве разработчика или бизнесмена, вы определенно понимаете, что не существует универсальных решений. Чем сложнее и инновационнее ваше приложение, тем больше правды в нем содержится. То же самое касается SSR и SSG.
Ссылка: https://tsh.io/blog/ssr-vs-ssg-in-nextjs/
#nextjs #реакция #javascript
1632537859
Not babashka. Node.js babashka!?
Ad-hoc CLJS scripting on Node.js.
Experimental. Please report issues here.
Nbb's main goal is to make it easy to get started with ad hoc CLJS scripting on Node.js.
Additional goals and features are:
Nbb requires Node.js v12 or newer.
CLJS code is evaluated through SCI, the same interpreter that powers babashka. Because SCI works with advanced compilation, the bundle size, especially when combined with other dependencies, is smaller than what you get with self-hosted CLJS. That makes startup faster. The trade-off is that execution is less performant and that only a subset of CLJS is available (e.g. no deftype, yet).
Install nbb
from NPM:
$ npm install nbb -g
Omit -g
for a local install.
Try out an expression:
$ nbb -e '(+ 1 2 3)'
6
And then install some other NPM libraries to use in the script. E.g.:
$ npm install csv-parse shelljs zx
Create a script which uses the NPM libraries:
(ns script
(:require ["csv-parse/lib/sync$default" :as csv-parse]
["fs" :as fs]
["path" :as path]
["shelljs$default" :as sh]
["term-size$default" :as term-size]
["zx$default" :as zx]
["zx$fs" :as zxfs]
[nbb.core :refer [*file*]]))
(prn (path/resolve "."))
(prn (term-size))
(println (count (str (fs/readFileSync *file*))))
(prn (sh/ls "."))
(prn (csv-parse "foo,bar"))
(prn (zxfs/existsSync *file*))
(zx/$ #js ["ls"])
Call the script:
$ nbb script.cljs
"/private/tmp/test-script"
#js {:columns 216, :rows 47}
510
#js ["node_modules" "package-lock.json" "package.json" "script.cljs"]
#js [#js ["foo" "bar"]]
true
$ ls
node_modules
package-lock.json
package.json
script.cljs
Nbb has first class support for macros: you can define them right inside your .cljs
file, like you are used to from JVM Clojure. Consider the plet
macro to make working with promises more palatable:
(defmacro plet
[bindings & body]
(let [binding-pairs (reverse (partition 2 bindings))
body (cons 'do body)]
(reduce (fn [body [sym expr]]
(let [expr (list '.resolve 'js/Promise expr)]
(list '.then expr (list 'clojure.core/fn (vector sym)
body))))
body
binding-pairs)))
Using this macro we can look async code more like sync code. Consider this puppeteer example:
(-> (.launch puppeteer)
(.then (fn [browser]
(-> (.newPage browser)
(.then (fn [page]
(-> (.goto page "https://clojure.org")
(.then #(.screenshot page #js{:path "screenshot.png"}))
(.catch #(js/console.log %))
(.then #(.close browser)))))))))
Using plet
this becomes:
(plet [browser (.launch puppeteer)
page (.newPage browser)
_ (.goto page "https://clojure.org")
_ (-> (.screenshot page #js{:path "screenshot.png"})
(.catch #(js/console.log %)))]
(.close browser))
See the puppeteer example for the full code.
Since v0.0.36, nbb includes promesa which is a library to deal with promises. The above plet
macro is similar to promesa.core/let
.
$ time nbb -e '(+ 1 2 3)'
6
nbb -e '(+ 1 2 3)' 0.17s user 0.02s system 109% cpu 0.168 total
The baseline startup time for a script is about 170ms seconds on my laptop. When invoked via npx
this adds another 300ms or so, so for faster startup, either use a globally installed nbb
or use $(npm bin)/nbb script.cljs
to bypass npx
.
Nbb does not depend on any NPM dependencies. All NPM libraries loaded by a script are resolved relative to that script. When using the Reagent module, React is resolved in the same way as any other NPM library.
To load .cljs
files from local paths or dependencies, you can use the --classpath
argument. The current dir is added to the classpath automatically. So if there is a file foo/bar.cljs
relative to your current dir, then you can load it via (:require [foo.bar :as fb])
. Note that nbb
uses the same naming conventions for namespaces and directories as other Clojure tools: foo-bar
in the namespace name becomes foo_bar
in the directory name.
To load dependencies from the Clojure ecosystem, you can use the Clojure CLI or babashka to download them and produce a classpath:
$ classpath="$(clojure -A:nbb -Spath -Sdeps '{:aliases {:nbb {:replace-deps {com.github.seancorfield/honeysql {:git/tag "v2.0.0-rc5" :git/sha "01c3a55"}}}}}')"
and then feed it to the --classpath
argument:
$ nbb --classpath "$classpath" -e "(require '[honey.sql :as sql]) (sql/format {:select :foo :from :bar :where [:= :baz 2]})"
["SELECT foo FROM bar WHERE baz = ?" 2]
Currently nbb
only reads from directories, not jar files, so you are encouraged to use git libs. Support for .jar
files will be added later.
The name of the file that is currently being executed is available via nbb.core/*file*
or on the metadata of vars:
(ns foo
(:require [nbb.core :refer [*file*]]))
(prn *file*) ;; "/private/tmp/foo.cljs"
(defn f [])
(prn (:file (meta #'f))) ;; "/private/tmp/foo.cljs"
Nbb includes reagent.core
which will be lazily loaded when required. You can use this together with ink to create a TUI application:
$ npm install ink
ink-demo.cljs
:
(ns ink-demo
(:require ["ink" :refer [render Text]]
[reagent.core :as r]))
(defonce state (r/atom 0))
(doseq [n (range 1 11)]
(js/setTimeout #(swap! state inc) (* n 500)))
(defn hello []
[:> Text {:color "green"} "Hello, world! " @state])
(render (r/as-element [hello]))
Working with callbacks and promises can become tedious. Since nbb v0.0.36 the promesa.core
namespace is included with the let
and do!
macros. An example:
(ns prom
(:require [promesa.core :as p]))
(defn sleep [ms]
(js/Promise.
(fn [resolve _]
(js/setTimeout resolve ms))))
(defn do-stuff
[]
(p/do!
(println "Doing stuff which takes a while")
(sleep 1000)
1))
(p/let [a (do-stuff)
b (inc a)
c (do-stuff)
d (+ b c)]
(prn d))
$ nbb prom.cljs
Doing stuff which takes a while
Doing stuff which takes a while
3
Also see API docs.
Since nbb v0.0.75 applied-science/js-interop is available:
(ns example
(:require [applied-science.js-interop :as j]))
(def o (j/lit {:a 1 :b 2 :c {:d 1}}))
(prn (j/select-keys o [:a :b])) ;; #js {:a 1, :b 2}
(prn (j/get-in o [:c :d])) ;; 1
Most of this library is supported in nbb, except the following:
:syms
.-x
notation. In nbb, you must use keywords.See the example of what is currently supported.
See the examples directory for small examples.
Also check out these projects built with nbb:
See API documentation.
See this gist on how to convert an nbb script or project to shadow-cljs.
Prequisites:
To build:
bb release
Run bb tasks
for more project-related tasks.
Download Details:
Author: borkdude
Download Link: Download The Source Code
Official Website: https://github.com/borkdude/nbb
License: EPL-1.0
#node #javascript
1625674200
In this video, we are going to implement Google Analytics to our Next JS application. Tracking page views of an application is very important.
Google analytics will allow us to track analytics information.
Frontend: https://github.com/amitavroy/video-reviews
API: https://github.com/amitavdevzone/video-review-api
App link: https://video-reviews.vercel.app
You can find me on:
Twitter: https://twitter.com/amitavroy7
Discord: https://discord.gg/Em4nuvQk
#next js #js #react js #react #next #google analytics
1625985180
In this video we’ll start from scratch to build out authentication in a brand new Next.js project to implement client, server, and API route authentication using AWS Amplify and Amazon Cognito.a
#next #next.js #ssr
1625751960
In this video, I wanted to touch upon the functionality of adding Chapters inside a Course. The idea was to not think much and start the development and pick up things as they come.
There are places where I get stuck and trying to find answers to it up doing what every developer does - Google and get help. I hope this will help you understand the flow and also how developers debug while doing development.
App url: https://video-reviews.vercel.app
Github code links below:
Next JS App: https://github.com/amitavroy/video-reviews
Laravel API: https://github.com/amitavdevzone/video-review-api
You can find me on:
Twitter: https://twitter.com/amitavroy7
Discord: https://discord.gg/Em4nuvQk
#next js #api #react next js #next #frontend #development
1615787193
Descargue el MBOX al convertidor PST y convierta los archivos MBOX al formato PST. Con esta aplicación, los archivos se convierten a gran velocidad sin ningún problema. Para conocer la aplicación el usuario puede instalar la versión demo de esta aplicación y así conocer la aplicación y su funcionamiento. Con una alta velocidad de compatibilidad, la aplicación convierte todos los archivos MBOX en formato PST.
Esta aplicación avanzada funciona en un orden específico para convertir los archivos MBOX a formato PST. Por lo tanto, a continuación se muestran algunos de los puntos que hablan sobre la aplicación y ver si la aplicación cumple con todas las expectativas del usuario.
Por lo tanto, la aplicación ofrece estas funciones avanzadas que permiten que el software funcione de manera avanzada.
Los usuarios pueden convertir el archivo en unos pocos pasos sin asistencia técnica. Siga estos pasos para convertir su archivo MBOX al formato PST de Outlook:
Paso 1: descargue el convertidor MBOX a PST
Paso 2- Inicie el convertidor
Paso 3- Seleccione los archivos MBOX que desea convertir
Paso 4- Ahora, elija el tipo que desea exportar los archivos.
Paso 5- Elija la ubicación donde desea guardar el archivo
Paso 6- Finalmente, haga clic derecho en el botón “Convertir ahora”.
Estos pasos pueden ser realizados por cualquier usuario novato.
Analicemos las funciones inteligentes de este convertidor que se indican a continuación:
Esta herramienta convierte archivos MBOX de cualquier tipo desde Thunderbird a Apple Mail. Este es un convertidor avanzado.
Los usuarios pueden convertir cualquier cantidad de archivos de datos sin ningún obstáculo. No importa cuál sea el tamaño del archivo MBOX, la conversión procede.
Los archivos que selecciona el usuario se convierten de archivos MBOX al formato PST de Outlook. Los resultados convertidos son los deseados por los usuarios.
El usuario puede guardar el archivo en cualquier ubicación donde el usuario quiera guardarlo. En una ubicación adecuada, se guardan los datos convertidos.
El usuario proporciona una interfaz fácil de usar que ayuda al usuario a convertir los archivos sin problemas y sin ningún obstáculo.
El resultado proporcionado por la aplicación es 100% exacto. La calidad del resultado sigue siendo impecable.
La aplicación da todos los resultados adecuados después de la conversión. Con una alta velocidad de compatibilidad, la tarea de conversión es procesada por la aplicación sin ningún error. Descargue la versión de demostración gratuita del convertidor MBOX a PST para ver si funciona.
Más información:- https://www.datavare.com/ru/конвертер-mbox-в-pst.html
#конвертер mbox в pst #mbox в импортер pst #преобразование mbox в pst #mbox в экспортер pst #конвертировать mbox в pst #импортировать mbox в pst