Skip to content

Commit

Permalink
#2936 document bun support (#3086)
Browse files Browse the repository at this point in the history
* #2936 document bun support

* Fix vale issues

* Minor initial edits.

* Second pass at editing.

---------

Co-authored-by: Russell J.T. Dyer <[email protected]>
Co-authored-by: Russell JT Dyer <[email protected]>
  • Loading branch information
3 people authored Jan 8, 2024
1 parent cc4e90e commit 3ea2c05
Show file tree
Hide file tree
Showing 8 changed files with 204 additions and 128 deletions.
2 changes: 2 additions & 0 deletions .github/styles/Vocab/Docs/accept.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Azure
Brotli
[bB]rowsable
[bB]rowser-less
bun
[bB]undlers?
[cC]acheable
classpath
Expand Down Expand Up @@ -89,6 +90,7 @@ Liferay
Liquibase
Lit
LitElement
lockfile
Logback
Lumo
macOS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ When running with the frontend development server, JavaScript and CSS and other
[role="since:com.vaadin:vaadin@V24"]
== Faster Starts by Pre-Compiling

The build and start-up time can be decreased significantly if no frontend installation or compilation is made. This means not installing the tools Node.js, npm/pnpm. It also means not downloading npm packages, or running the Vite development server.
The build and start-up time can be decreased significantly if no frontend installation or compilation is made. This means not installing the tools Node.js, npm/pnpm/bun. It also means not having to download npm packages, or running the Vite development server.

If your project uses only the standard Vaadin Flow components or third-party Vaadin add-ons (e.g., from Vaadin Directory) without client code, Vaadin skips frontend compilation and uses the default themes and frontend files shipped with the Vaadin platform.
If your project uses only the standard Vaadin Flow components or third-party Vaadin add-ons (e.g., from the Vaadin Directory) without client code, Vaadin skips frontend compilation and uses the default themes and frontend files shipped with the Vaadin platform.

Adding any custom JavaScript/TypeScript or add-ons with frontend customizations to a project can trigger the frontend re-compilation using Vite during the next start-up of the application. Any new or missing frontend packages are downloaded using npm/pnpm before building. Vaadin automatically does this, and spots the frontend customizations.
Adding any custom JavaScript/TypeScript or add-ons with frontend customizations to a project can trigger the frontend re-compilation using Vite the next time the application is started. Any new or missing frontend packages are downloaded using npm/pnpm/bun before building. Vaadin does this automatically, and spots the frontend customizations.

Making a new frontend bundle takes time. However, the generated frontend files are compressed to the `src/main/bundles/prod.bundle` file inside the project’s root. This file can be added to the Version Control System, which allows other developers to fetch the application bundle and thereby run it.

Expand All @@ -41,7 +41,7 @@ The application bundle is the same as the default bundle, but it's made for a sp

Vaadin generates an application bundle in the following situations:

- An npm/pnpm package is added with `@NpmPackage`, or directly into [filename]`package.json`;
- An npm package is added with `@NpmPackage`, or directly into [filename]`package.json`;
- CSS or JavaScript is added with `@CssImport`, `@JsModule`, or `@JavaScript`;
- Vaadin add-on with frontend customizations is added;
- Custom theme packaged as a `JAR` dependency is added, if it defines any assets to be added to the project; or
Expand All @@ -65,7 +65,7 @@ When working with a frontend heavy project, there can be a frontend development

Vaadin uses Vite to quicken frontend development by enabling the client-side live reload. By doing this, JavaScript/TypeScript changes are updated immediately in the browser. Vite only re-compiles what has changed, making hot reloads fast.

Vite installation is made through npm/pnpm. Running Vite requires Node.js. See <<{articles}/configuration/development-mode/node-js#,Node.js installation>> and <<{articles}/configuration/development-mode/npm-pnpm#,Configuring frontend package manager>> for more information.
Vite installation is made through npm/pnpm/bun. Running Vite requires Node.js. See <<{articles}/configuration/development-mode/node-js#,Node.js installation>> and <<{articles}/configuration/development-mode/npm-pnpm-bun#,Configuring frontend package manager>> for more information.

This mode is recommended if components or views use <<{articles}/create-ui/templates#,Templates>> and are edited often. This mode is used when the configuration parameter `frontend.hotdeploy` is set to `true` (see <<{articles}/configuration/properties#,Configuration Properties>> for more information).

Expand Down
183 changes: 183 additions & 0 deletions articles/configuration/development-mode/npm-pnpm-bun.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
---
title: npm/pnpm/bun
description: Configuring the frontend package manager.
order: 20
---


= Configuring npm/pnpm/bun

https://docs.npmjs.com/cli/v8/commands/npm[npm] is the recommended and default package manager for Vaadin projects. This page explains how to configure npm and how to change to an alternative package manager (i.e., pnpm or bun).


== Install a Custom Package

To install a custom frontend package into your project with `npm`, run `npm i xxx`. For example, to add the `mobx` package as a dependency in [filename]`package.json` as well as install it into `node_modules`, run the following command in the project directory:

[source,terminal]
----
npm i mobx
----

[NOTE]
Vaadin expects transitive platform dependencies to be available directly under `node_modules`.
Vaadin uses the `npm` https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides[overrides feature] (since `npm` 8.3.0) to lock the transitive platform dependencies versions.


== Switch Among npm, pnpm & bun

`npm` is used as the default frontend package manager. Vaadin also supports using https://pnpm.io[_pnpm_] (also known as, _performant npm_). To switch to `pnpm`, you can set the `vaadin.pnpm.enable` system property to `true`.

When using `pnpm`, the framework installs it locally using `npm` if it isn't installed globally. The [filename]`package-lock.json` file that's used by `npm` is incompatible with `pnpm` and is removed automatically if `pnpm` is used. `pnpm` uses the [filename]`pnpm-lock.yaml` file instead of [filename]`package-lock.json`. Any custom dependency configurations should go to [filename]`pnpm-lock.yaml`.

Using https://bun.sh[_bun_] is also supported by Vaadin. With bun, packages are cached locally by default and linked -- instead of downloaded -- for every project. This results in reduced disk space usage, and faster recurring builds compared to npm. To switch to `bun`, you can set the `vaadin.bun.enable` system property to `true`.

When using bun, a https://bun.sh/docs/install/lockfile[_binary lockfile_] named [filename]`bun.lockb` is used when `bun install` is run. This lockfile is not included in or used from Vaadin development bundle.

[NOTE]
Vaadin does not support automatic installation of bun - instead please follow the https://bun.sh/package-manager[_installation instructions_].


=== Switching in a Spring Boot Project

For a Spring Boot-based project, you can add `vaadin.pnpm.enable = true` or `vaadin.bun.enable = true` to the [filename]`application.properties` file.


=== Switching in a Plain Java or JavaEE Project

For a plain Java or a JavaEE-based project, you can set the `pnpmEnable` or `bunEnable` configuration property inside the `vaadin-maven-plugin`.

.Enable pnpm (plain Java / JavaEE)
[source,xml]
----
<plugin>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<goals>
<goal>prepare-frontend</goal>
</goals>
</execution>
</executions>
<configuration>
<pnpmEnable>true</pnpmEnable>
</configuration>
</plugin>
----

.Enable bun (plain Java / JavaEE)
[source,xml]
----
<plugin>
<groupId>com.vaadin</groupId>
<artifactId>vaadin-maven-plugin</artifactId>
<version>${project.version}</version>
<executions>
<execution>
<goals>
<goal>prepare-frontend</goal>
</goals>
</execution>
</executions>
<configuration>
<bunEnable>true</bunEnable>
</configuration>
</plugin>
----

Alternatively, you can use the Servlet 3.0 `@WebServlet` annotation:

.Enable pnpm (via annotation)
[source,java]
----
@WebServlet(urlPatterns = "/*", name = "myservlet", asyncSupported = true, loadOnStartup = 1,
initParams = { @WebInitParam(name = "pnpm.enable", value = "true") })
public class CustomServlet extends VaadinServlet {
}
----

.Enable bun (via annotation)
[source,java]
----
@WebServlet(urlPatterns = "/*", name = "myservlet", asyncSupported = true, loadOnStartup = 1,
initParams = { @WebInitParam(name = "bun.enable", value = "true") })
public class CustomServlet extends VaadinServlet {
}
----

or use the traditional [filename]`web.xml` file:

.Enable pnpm (via web.xml)
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<web-app
id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>
com.vaadin.flow.server.VaadinServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>pnpm.enable</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
----

.Enable bun (via web.xml)
[source,xml]
----
<?xml version="1.0" encoding="UTF-8"?>
<web-app
id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>
com.vaadin.flow.server.VaadinServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>bun.enable</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
----

For more about how to set properties, see <<{articles}/configuration/properties#,Configuration Properties>>.


[discussion-id]`B8A479EF-56AF-4F64-A52B-A2C01F1E5991`

++++
<style>
[class^=PageHeader-module--descriptionContainer] {display: none;}
</style>
++++
116 changes: 0 additions & 116 deletions articles/configuration/development-mode/npm-pnpm.asciidoc

This file was deleted.

8 changes: 6 additions & 2 deletions articles/configuration/properties.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,11 @@ The following table contains the properties that are defined in the [classname]`

|`pnpm.enable`
|`false`
|Enables `pnpm`, instead of `npm`, to resolve and download frontend dependencies. It's set by default to `false` since `npm` is used typically. Set it to `true` to enable `pnpm`. See <<development-mode/npm-pnpm#, Switching Between npm and pnpm>> for more information.
|Enables `pnpm`, instead of `npm`, to resolve and download frontend dependencies. It's set by default to `false` since `npm` is used typically. Set it to `true` to enable `pnpm`. See <<development-mode/npm-pnpm-bun#, Switching Between npm, pnpm and bun>> for more information.

|`bun.enable`
|`false`
|Enables `bun`, instead of `npm`, to resolve and download frontend dependencies. It's set by default to `false` since `npm` is used typically. Set it to `true` to enable `bun`. See <<development-mode/npm-pnpm-bun#, Switching Between npm, pnpm and bun>> for more information.

|`productionMode`
|`false`
Expand Down Expand Up @@ -209,7 +213,7 @@ The following table contains the properties that are used only by the Vaadin Mav

|`vaadin.ci.build`
|`ciBuild`
|Determines whether `npm ci` is run, instead of `npm i`, for production frontend builds. If you use `pnpm`, the install command runs with the `--frozen-lockfile` parameter. The build fails if the [filename]`package.json` and [filename]`package-lock.json` files have mismatching versions.
|Determines whether `npm ci` is run, instead of `npm i`, for production frontend builds. If you use `pnpm` or `bun`, the install command runs with the `--frozen-lockfile` parameter. The build fails if the [filename]`package.json` and the lockfile have mismatching versions.
|`false`

|`vaadin.force.production.build`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ To use a Web Component in Vaadin, you first have to load the HTML, JavaScript, a

The Web Component's client-side files -- typically JavaScript module files -- are available using https://www.npmjs.com/[npm], which Vaadin supports by default. It automatically installs and uses `npm` packages. It also serves the static files to the browser.

.Using pnpm instead of npm
.Using pnpm or bun instead of npm
[TIP]
Vaadin also supports using https://www.npmjs.com/package/pnpm[pnpm] (known as _performant npm_). See <<{articles}/configuration/development-mode/npm-pnpm#,Configuring npm/pnpm>> for details.
Vaadin also supports using https://www.npmjs.com/package/pnpm[pnpm] (known as _performant npm_) or https://bun.sh[_bun_]. See <<{articles}/configuration/development-mode/npm-pnpm-bun#,Configuring npm/pnpm/bun>> for details.


== Integrating a JS Module into Vaadin
Expand Down
Loading

0 comments on commit 3ea2c05

Please sign in to comment.