You don't need a build step

This page summarizes the projects mentioned and recommended in the original post on news.ycombinator.com

Our great sponsors
  • SurveyJS - Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App
  • WorkOS - The modern identity platform for B2B SaaS
  • InfluxDB - Power Real-Time Data Analytics at Scale
  • fresh

    The next-gen web framework.

  • IMO, this post doesn't discuss the tradeoff of removing the build step. What a “build” is has been obfuscated. When you deploy an app, you now need to convert TypeScript into JS, and then the JS needs to be turned into an optimal representation for V8 to process.

    For example, Fresh has a “build process” whose cost is paid for by the user [1]. You want to do these things before the user hits your page, and that’s the nice thing about CI/CD. You can ensure correctness and you can optimize code.

    In the interest of losing the build step, a tradeoff is made for worse UX for developer experience (DX). Rather, I would recommend shifting the compute that makes sense to the build step, and then give developers the optionality to do other work lazily at runtime[2].

    [1]: https://github.com/denoland/fresh/blob/08d28438e10ef36ea5965...

    [2]: https://vercel.com/docs/concepts/incremental-static-regenera...

  • JitPack

    Documentation and issues of https://jitpack.io

  • https://github.com/jitpack/jitpack.io/issues?q=is%3Aissue+so...

  • SurveyJS

    Open-Source JSON Form Builder to Create Dynamic Forms Right in Your App. With SurveyJS form UI libraries, you can build and style forms in a fully-integrated drag & drop form builder, render them in your JS app, and store form submission data in any backend, inc. PHP, ASP.NET Core, and Node.js.

    SurveyJS logo
  • proposal-type-annotations

    ECMAScript proposal for type syntax that is erased - Stage 1

  • There is an ES39 proposal to allow type annotations in Javascript, that would allow the browser to handle TS/Flow files without needing a compile step:

    https://github.com/tc39/proposal-type-annotations

  • rescript-compiler

    The compiler for ReScript.

  • Civet

    A TypeScript superset that favors more types and less typing

  • deno

    A modern runtime for JavaScript and TypeScript.

  • https://github.com/denoland/deno/issues/1739 just crossed 4 years. if they want people to do transpiling inside their own tool create an API so we can use our own tools rather than ones behind their black box.

    Would be a much better use of their time than writing this nonsensical bs

  • FrameworkBenchmarks

    Source for the TechEmpower Framework Benchmarks project

  • > And as someone who has worked on both, I can tell you that the container ecosystem is way better and way more deterministic. `Dockerfile` from 10 years back would work today as well. Any non-trivial package.json written even a few years ago would have half the packages deprecated in non-backward compatible way!

    As I wrote elsewhere, Dockerfiles are not deterministic. The build artifacts that they produce are deterministic, but that would be comparing a build artifact to a build system.

    > There is another similar ecosystem of mobile apps. That's also way superior in terms of the developer experience.

    Mobile app users have different performance expectations. No one bats an eye if a mobile app takes several minutes to download/update, but a website that does so would be considered an atrocity.

    > And that's not what I am objecting to. My concern is that the core JS specification is so barebones that it fragments right from the start.

    JS is actually really well specified by ECMA. There are so many languages where the formal specification is "whatever the most popular compiler outputs".

    > You make different choices and soon every single JS project looks drastically different from every other project.

    The same could be said of any other moderately complex project written in a different language. Look at the Techempower benchmarks for Java, and tell me those projects all look identical [2].

    > 1. There isn't a standard project format 2. There isn't a single framework that's backward compatible for 5+ years. 3. There isn't even an agreeement on the right build tools (npm vs yarn vs pnpm...) 4. There isn't an agreement on how to do multi-threaded async work

    A lot of the complexity you're describing stems from running in the browser. A server-side js project that returns plain html with a standard templating language is remarkably stable. Express has been on version 4.x.x for literally 9 years [3]. Package.json is supported by yarn, npm, and pnpm. As long as you have a valid lock file and install dependencies using npm ci, you really shouldn't have too many issues running most js projects. I'm not sure what issues you've had with multi-threaded async. The standard for multi-threading in js is web workers (which are called worker threads in node). The js ecosystem is not like Scala or Rust, where's there's tokio and akka. JS uses promises for concurrency, and workers for parallelism.

    [1] https://news.ycombinator.com/item?id=35002815

    [2]https://github.com/TechEmpower/FrameworkBenchmarks/tree/9844...

    [3] https://www.npmjs.com/package/express/v/4.0.0

  • WorkOS

    The modern identity platform for B2B SaaS. The APIs are flexible and easy-to-use, supporting authentication, user identity, and complex enterprise features like SSO and SCIM provisioning.

    WorkOS logo
  • Express

    Fast, unopinionated, minimalist web framework for node.

  • > And as someone who has worked on both, I can tell you that the container ecosystem is way better and way more deterministic. `Dockerfile` from 10 years back would work today as well. Any non-trivial package.json written even a few years ago would have half the packages deprecated in non-backward compatible way!

    As I wrote elsewhere, Dockerfiles are not deterministic. The build artifacts that they produce are deterministic, but that would be comparing a build artifact to a build system.

    > There is another similar ecosystem of mobile apps. That's also way superior in terms of the developer experience.

    Mobile app users have different performance expectations. No one bats an eye if a mobile app takes several minutes to download/update, but a website that does so would be considered an atrocity.

    > And that's not what I am objecting to. My concern is that the core JS specification is so barebones that it fragments right from the start.

    JS is actually really well specified by ECMA. There are so many languages where the formal specification is "whatever the most popular compiler outputs".

    > You make different choices and soon every single JS project looks drastically different from every other project.

    The same could be said of any other moderately complex project written in a different language. Look at the Techempower benchmarks for Java, and tell me those projects all look identical [2].

    > 1. There isn't a standard project format 2. There isn't a single framework that's backward compatible for 5+ years. 3. There isn't even an agreeement on the right build tools (npm vs yarn vs pnpm...) 4. There isn't an agreement on how to do multi-threaded async work

    A lot of the complexity you're describing stems from running in the browser. A server-side js project that returns plain html with a standard templating language is remarkably stable. Express has been on version 4.x.x for literally 9 years [3]. Package.json is supported by yarn, npm, and pnpm. As long as you have a valid lock file and install dependencies using npm ci, you really shouldn't have too many issues running most js projects. I'm not sure what issues you've had with multi-threaded async. The standard for multi-threading in js is web workers (which are called worker threads in node). The js ecosystem is not like Scala or Rust, where's there's tokio and akka. JS uses promises for concurrency, and workers for parallelism.

    [1] https://news.ycombinator.com/item?id=35002815

    [2]https://github.com/TechEmpower/FrameworkBenchmarks/tree/9844...

    [3] https://www.npmjs.com/package/express/v/4.0.0

NOTE: The number of mentions on this list indicates mentions on common posts plus user suggested alternatives. Hence, a higher number means a more popular project.

Suggest a related project

Related posts