Utilities for building Next.js applications with Bazel and rules_js.
All invocations of Next.js are done through a next_js_binary
target passed into the macros. This is normally generated once alongside the package.json
containing the next
dependency:
load("@npm//:next/package_json.bzl", next_bin = "bin") next_bin.next_binary( name = "next_js_binary", visibility = ["//visibility:public"], )
The next binary is then passed into the macros, for example:
nextjs_build( name = "next", config = "next.config.mjs", srcs = glob(["src/**"]), next_js_binary = "//:next_js_binary", )
There are two sets of macros for building Next.js applications: standard and standalone.
nextjs()
: wrap the build+dev+start targetsnextjs_build()
: the Next.js build commandnextjs_dev()
: the Next.js dev commandnextjs_start()
: the Next.js start command, accepting a Next.js build artifact to startnextjs_standalone_build()
: the Next.js build command, configured for a standalone application within bazelnextjs_standalone_server()
: constructs a standalone Next.js server js_binary
following the standalone directory structure guidelinesGenerates Next.js build, dev & start targets.
{name}
- a Next.js production bundle {name}.dev
- a Next.js devserver {name}.start
- a Next.js prodserver
Use this macro in the BUILD file at the root of a next app where the next.config.mjs
file is located.
For example, a target such as //app:next
in app/BUILD.bazel
next( name = "next", config = "next.config.mjs", srcs = glob(["src/**"]), data = [ "//:node_modules/next", "//:node_modules/react-dom", "//:node_modules/react", "package.json", ], next_js_binary = "//:next_js_binary", )
will create the targets:
//app:next //app:next.dev //app:next.start
To build the above next app, equivalent to running next build
outside Bazel:
bazel build //app:next
To run the development server in watch mode with ibazel, equivalent to running next dev
outside Bazel:
ibazel run //app:next.dev
To run the production server in watch mode with ibazel, equivalent to running next start
outside Bazel:
ibazel run //app:next.start
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the build target | none |
srcs | Source files to include in build & dev targets. Typically these are source files or transpiled source files in Next.js source folders such as pages , public & styles . | none |
next_js_binary | The next js_binary target to use for running Next.jsTypically this is a js_binary target created using bin loaded from the package_json.bzl file of the npm package.See main docstring above for example usage. | none |
config | the Next.js config file. Typically next.config.mjs . | "next.config.mjs" |
data | Data files to include in all targets. These are typically npm packages required for the build & configuration files such as package.json and next.config.js. | [] |
serve_data | Data files to include in devserver targets | [] |
kwargs | Other attributes passed to all targets such as tags . | none |
Build the Next.js production artifact.
See https://nextjs.org/docs/pages/api-reference/cli/next#build
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the build target | none |
config | the Next.js config file | none |
srcs | the sources to include in the build, including any transitive deps | none |
next_js_binary | The next js_binary target to use for running Next.jsTypically this is a js_binary target created using bin loaded from the package_json.bzl file of the npm package.See main docstring above for example usage. | none |
data | the data files to include in the build | [] |
kwargs | Other attributes passed to all targets such as tags , env | none |
Run the Next.js development server.
See https://nextjs.org/docs/pages/api-reference/cli/next#next-dev-options
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the build target | none |
config | the Next.js config file | none |
srcs | the sources to include in the build, including any transitive deps | none |
data | additional devserver runtime data | none |
next_js_binary | The next js_binary target to use for running Next.jsTypically this is a js_binary target created using bin loaded from the package_json.bzl file of the npm package.See main docstring above for example usage. | none |
kwargs | Other attributes passed to all targets such as tags , env | none |
Compile a standalone Next.js application.
NOTE: a next.config.mjs
is generated, wrapping the passed config
, to overcome Next.js limitation with bazel, rules_js and pnpm (with hoist=false, as required by rules_js).
Due to the generated next.config.mjs
file the nextjs_standalone_build(config)
must have a unique name or file path that does not conflict with standard Next.js config files.
Issues worked around by the generated config include:
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the build target | none |
config | the Next.js config file | none |
srcs | the sources to include in the build, including any transitive deps | none |
next_js_binary | the Next.js binary to use for building | none |
data | the data files to include in the build | [] |
kwargs | Other attributes passed to all targets such as tags , env | none |
Configures the output of a standalone Next.js application to be a standalone server binary.
See the Next.js standalone server documentation for details on the standalone server directory structure.
This function is normally used in conjunction with nextjs_standalone_build
to create a standalone Next.js application. The standalone server is a js_binary
target that can be run with bazel run
or deployed in a container image etc.
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the binary target | none |
app | the standalone app directory, typically the output of nextjs_standalone_build | none |
pkg | the directory server.js is in within the standalone/ directory. This is normally the application path relative to the pnpm-lock.yaml. Default: native.package_name() (for a pnpm-lock.yaml in the root of the workspace) | None |
data | runtime data required to run the standalone server. Normally requires [":node_modules/next", ":node_modules/react"] which are not included in the Next.js standalone output. | [] |
kwargs | additional js_binary attributes | none |
Run the Next.js production server for an app.
See https://nextjs.org/docs/pages/api-reference/cli/next#next-start-options
PARAMETERS
Name | Description | Default Value |
---|---|---|
name | the name of the build target | none |
config | the Next.js config file | none |
app | the pre-compiled Next.js application, typically the output of nextjs_build | none |
next_js_binary | The next js_binary target to use for running Next.jsTypically this is a js_binary target created using bin loaded from the package_json.bzl file of the npm package.See main docstring above for example usage. | none |
data | additional server data | [] |
kwargs | Other attributes passed to all targets such as tags , env | none |