1653394096
In web development, static site generators have become a hot topic, and they have dramatically improved. They are pretty simple to use and come with a number of features out of the box to build super-fast, lightweight web applications.
In this article, I will walk you through two of the most popular static site generators for React, Gatsby, and Next.js, and help you choose the best for your next project.
More than a static site generator, Gatsby is a modern front-end framework built on top of React, GraphQL, and Webpack.
Gatsby helps us to create websites that generate static HTML in advance and store it on content delivery networks (CDNs) all over the world for faster accessibility. For example, it doesn’t need a server or database to load a blog website. Furthermore, it uses various techniques, including asset optimization, server-side rendering, data pre-fetching, and code splitting, to load pages rapidly.
Although Gatsby is built on top of React, it has its own ecosystem with plugins, themes, and starters like any other framework. When working with the Gatsby ecosystem, a developer has the privilege of creating a website in numerous ways. In addition, Gatsby plugins can enhance and modify anything Gatsby can handle.
Next.js is a server-side rendering (SSR) tool, but with version 9.3, it also supports static site generation. The idea behind it is to create server-rendered React apps that require minimal to no configuration.
Next.js is more about enhancing the developer experience by making it simpler to create comprehensive, SSR-friendly web applications. Although Next.js facilitates static builds, that isn’t its main focus. We can use Next.js when a website should handle both SSR and static page optimization. It doesn’t come with any unnecessary tools or make any assumptions about how you want to manage your data.
Next.js is the best tool for creating dynamic websites that have healthy server interactions. It gives you more flexibility when it comes to building apps with features like single-file components, automatic code-splitting, and hot code reloading.
Despite the fact that Gatsby and Next.js are designed to handle different situations, they have a lot in common.
Since we’ve discussed the benefits and some features of both Gatsby and Next.js, let’s look at choosing one of them.
Gatsby thrives in building static websites. A static website contains a sequence of HTML pages, each of which represents a single webpage (e.g., a personal blog). Gatsby is ideal for creating these websites because the number of pages is predetermined, and the content does not vary. Also, Gatsby is compatible with a wide range of CMS systems, REST APIs, databases, and GraphQL.
As Gatsby isolates the data changes from the website content, even a non-developer can modify data relevant to the webpage from the back end. Then, it will assemble the changes in the runtime. In addition, it removes the need for code freezes.
Gatsby is the recommended framework for developing static websites due to its capability to integrate with a CMS via a large collection of Gatsby plugins, starters, and themes. Gatsby also compresses the development lifecycle.
Next.js is an excellent pick if you’re building a website where many users will create user accounts and subsequently comment on the page contents.
Multiple users may log in at any time on these websites, making it hard to develop a static page in real time. In this scenario, static HTML will need to be compiled for each user. Gatsby’s lengthy build time makes it an unsuitable platform for such applications.
You have to display unique, dynamic content for specific logged-in users on websites like this. Server-side rendering will make it easier to serve a diverse group of users based on authentication, and each user will be able to see their own information immediately as they generate it on the website.
So, it appears to be a straightforward choice: Use Gatsby for static webpages and Next.js for huge, multiuser websites.
But what if you’re building a hybrid web app?
Next.js outperforms Gatsby when it comes to building hybrid web applications that require both SSR and client-side rendering. Also, most web pages must be streamlined for search engines, and the material on these pages is frequently dynamic; Next.js is the preferable framework.
We can use Next.js to create an ideal e-commerce web app since it blends the benefits of both static site generation and server-side rendering.
I discussed the features, benefits, and use cases of both Gatsby and Next.js throughout this article. Both are remarkable frameworks that come with their own pros and cons. I believe the choice between Gatsby and Next.js should always depend on your project requirements. Choose the one that best fits your needs. For more insights, I recommend looking over their documentation.
Furthermore, since Gatsby is a framework with a large number of themes, plugins, and templates, developers who want to create a fully functional app or website in a short period of time tend to choose Gatsby over Next.js.
Don’t hesitate to let us know your experience working with these two frameworks in the comments section. Thank you for reading!
The Syncfusion React suite offers over 70 high-performance, lightweight, modular, and responsive UI components in a single package. It’s the only suite you’ll ever need to construct a complete application.
If you have questions, you can contact us through our support forum, support portal, or feedback portal. We are always happy to assist you!
https://www.syncfusion.com/blogs/post/static-site-generators-gatsby-vs-next-js-in-2022.aspx
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
1605177550
#hugo #static #site #generator #markup #static site generator
1624874066
Benefits of Using Static Site Generators
#best static site generator #gatsby vs gridsome #web dev
1626645300
Setup Gatsby filesystem to make sure Gatsby is aware of application local files so you can access them via GraphQL.
This is a single video in a series of 26 lessons. Watch the entire course at this playlist here: https://www.youtube.com/playlist?list=PLW0RabRDhwwzVNhlOgQQgw6HJzXdM1MnT
Want to support the channel? We make our courses free to watch so anyone can access our content and level up their skills. For our larger courses, like this one, we sell the final code and design files for a small price to help support the creation of free educational content like this.
You can purchase the course files below–any support is greatly appreciated!
#WebDev #WebDesign #WebDevelopment
#gatsby js #gatsby #js #webdev