• Stars
    star
    4,678
  • Rank 8,597 (Top 0.2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 7 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

😺 Your next Preact PWA starts in 30 seconds.

preact-cli NPM Downloads NPM Version

Start building a Preact Progressive Web App in seconds 🔥

Contents

Features

  • 100/100 Lighthouse score, right out of the box (proof)
  • Fully automatic code splitting for routes (see Route-Based Code Splitting)
  • Transparently code-split any component with an async! prefix
  • Auto-generated Service Workers for offline caching powered by Workbox
  • PRPL pattern support for efficient loading
  • Zero-configuration pre-rendering / server-side rendering hydration
  • Support for CSS Modules, LESS, Sass, Stylus; with Autoprefixer
  • Monitor your bundle/chunk sizes with built-in tracking
  • Automatic app mounting, debug helpers & Hot Module Replacement
  • In just 4.5kb you get a productive environment:

Requirements

Important: Node.js >= v12 is required.

Usage

$ npx preact-cli create <template-name> <project-name>

Note You can try out the v4 beta by using either of the following initializers instead (and they should be much faster!):

$ npm init preact-cli <template-name> <project-name>

$ yarn create preact-cli <template-name> <project-name>

Example:

$ npx preact-cli create default my-project

The above command pulls the template from preactjs-templates/default, prompts for some information, and generates the project at ./my-project/.

Official Templates

The purpose of official preact project templates are to provide opinionated development tooling setups so that users can get started with actual app code as fast as possible. However, these templates are un-opinionated in terms of how you structure your app code and what libraries you use in addition to preact.js.

All official project templates are repos in the preactjs-templates organization. When a new template is added to the organization, you will be able to run npx preact-cli create <template-name> <project-name> to use that template.

Current available templates include:

  • default - Default template with all features

  • simple - The simplest possible preact setup in a single file

  • netlify - Netlify CMS template using preact

  • typescript - Default template implemented in TypeScript

  • widget - Template for a widget to be embedded in another website

  • widget-typescript - Widget template implemented in TypeScript

💁 Tip: Any Github repo with a 'template' folder can be used as a custom template:
npx preact-cli create <username>/<repository> <project-name>

CLI Options

preact create

Create a project to quick start development.

$ npx preact-cli create <template-name> <project-name>

  --name        The application name.
  --cwd         A directory to use instead of $PWD.
  --force       Force option to create the directory for the new app  [boolean] [default: false]
  --yarn        Installs dependencies with yarn.                      [boolean] [default: false]
  --git         Initialize version control using git.                 [boolean] [default: false]
  --install     Installs dependencies.                                [boolean] [default: true]

Note: If you don't specify enough data to the npx preact-cli create command, it will prompt the required questions.

preact build

Create a production build

You can disable default: true flags by prefixing them with --no-<option>; for example, --no-sw, --no-esm, and --no-inline-css.

$ preact build

    --src              Specify source directory  (default src)
    --dest             Specify output directory  (default build)
    --cwd              A directory to use instead of $PWD  (default .)
    --esm              Builds ES-2015 bundles for your code  (default true)
    --sw               Generate and attach a Service Worker  (default true)
    --babelConfig      Path to custom Babel config (default .babelrc)
    --json             Generate build stats for bundle analysis
    --template         Path to custom HTML template (default 'src/template.html')
    --preload          Adds preload tags to the document its assets  (default false)
    --analyze          Launch interactive Analyzer to inspect production bundle(s)
    --prerender        Renders route(s) into generated static HTML  (default true)
    --prerenderUrls    Path to pre-rendered routes config  (default prerender-urls.json)
    --brotli           Adds brotli redirects to the service worker  (default false)
    --inline-css       Adds critical css to the prerendered markup  (default true)
    -c, --config       Path to custom CLI config  (default preact.config.js)
    -v, --verbose      Verbose output
    -h, --help         Displays this message

preact watch

Spin up a development server with multiple features like hot-module-replacement, module-watcher

$ preact watch

    --src              Specify source directory  (default src)
    --cwd              A directory to use instead of $PWD  (default .)
    --esm              Builds ES-2015 bundles for your code  (default false)
    --clear            Clear the console (default true)
    --sw               Generate and attach a Service Worker  (default false)
    --babelConfig      Path to custom Babel config (default .babelrc)
    --json             Generate build stats for bundle analysis
    --https            Run server with HTTPS protocol
    --key              Path to PEM key for custom SSL certificate
    --cert             Path to custom SSL certificate
    --cacert           Path to optional CA certificate override
    --prerender        Pre-render static content on first run
    --prerenderUrls    Path to pre-rendered routes config  (default prerender-urls.json)
    --template         Path to custom HTML template (default 'src/template.html')
    --refresh          Enables experimental preact-refresh functionality
    -c, --config       Path to custom CLI config  (default preact.config.js)
    -H, --host         Set server hostname  (default 0.0.0.0)
    -p, --port         Set server port  (default 8080)
    -h, --help         Displays this message

Note:

  1. You can run dev server using HTTPS then you can use the following HTTPS=true preact watch
  2. You can run the dev server on a different port using PORT=8091 preact watch

preact list

Lists all the official preactjs-cli repositories

$ preact list

preact info

Prints debugging information concerning the local environment.

Pre-rendering

Preact CLI in order to follow PRPL pattern renders initial route (/) into generated static index.html - this ensures that users get to see your page before any JavaScript is run, and thus providing users with slow devices or poor connection your website's content much faster.

Preact CLI does this by rendering your app inside node - this means that we don't have access to DOM or other global variables available in browsers, similar how it would be in server-side rendering scenarios. In case you need to rely on browser APIs you could:

  • drop out of prerendering by passing --no-prerender flag to preact build,
  • write your code in a way that supports server-side rendering by wrapping code that requires browser's APIs in conditional statements if (typeof window !== "undefined") { ... } ensuring that on server those lines of code are never reached. Alternatively you could use a helper library like window-or-global.

Custom Configuration

Plugins

To make customizing your configuration easier, preact-cli supports plugins. Visit the Plugins wiki for a tutorial on how to use them.

Browserslist

You may customize your list of supported browser versions by declaring a "browserslist" key within your package.json. Changing these values will modify your JavaScript (via @babel/preset-env) and your CSS (via autoprefixer) output.

By default, preact-cli emulates the following config:

package.json

{
	"browserslist": ["> 0.25%", "IE >= 9"]
}

Babel

To customize Babel, you have two options:

  1. You may create a .babelrc file in your project's root directory. Any settings you define here will overwrite matching config-keys within Preact CLI preset. For example, if you pass a "plugins" object, it will replace & reset all Babel plugins that Preact CLI defaults to.

  2. If you'd like to modify or add to the existing Babel config, you must use a preact.config.js file. Visit the Webpack section for more info, or check out the Customize Babel example!

Webpack

To customize preact-cli create a preact.config.js or a preact.config.json file.

preact.config.js

// ... imports or other code up here ...

/**
 * Function that mutates the original webpack config.
 * Supports asynchronous changes when a promise is returned (or it's an async function).
 *
 * @param {import('preact-cli').Config} config - original webpack config
 * @param {import('preact-cli').Env} env - current environment and options pass to the CLI
 * @param {import('preact-cli').Helpers} helpers - object with useful helpers for working with the webpack config
 * @param {Record<string, unknown>} options - this is mainly relevant for plugins (will always be empty in the config), default to an empty object
 */
export default (config, env, helpers, options) => {
	/** you can change the config here **/
};

See Webpack config helpers wiki for more info on the helpers argument which contains methods to find various parts of configuration. Additionally see our recipes wiki containing examples on how to change webpack configuration.

Prerender multiple routes

The --prerender flag will prerender by default only the root of your application. If you want to prerender other routes you can create a prerender-urls.json file, which contains the set of routes you want to render. The format required for defining your routes is an array of objects with a url key and an optional title key.

prerender-urls.json

[
	{
		"url": "/",
		"title": "Homepage"
	},
	{
		"url": "/route/random"
	}
]

You can customise the path and/or name of prerender-urls.json by using the flag --prerenderUrls.

preact build --prerenderUrls src/prerender-urls.json

If a static JSON file is too restrictive, you may want to provide a javascript file that exports your routes instead. Routes can be exported as a JSON string or an object and can optionally be returned from a function.

prerender-urls.js

module.exports = [
	{
		url: '/',
		title: 'Homepage',
	},
	{
		url: '/route/random',
	},
];

prerender-urls.js

export default () => {
	return [
		{
			url: '/',
			title: 'Homepage',
		},
		{
			url: '/route/random',
		},
	];
};

Template

A template is used to render your page by EJS. You can uses the data of prerenderUrls which does not have title, using htmlWebpackPlugin.options.CLI_DATA.preRenderData in EJS.

The default one is visible here and it's going to be enough for the majority of cases.

If you want to customise your template you can pass a custom template with the --template flag.

The --template flag is available on the build and watch commands.

preact build --template src/template.html
preact watch --template src/template.html

Using CSS preprocessors

The default templates comes with a .css file for each component. You can start using CSS preprocessors at any given time during your project lifecycle by installing additional packages and then simply replacing those .css files.

SASS

  • npm install --save-dev sass sass-loader@10 (inside your preact application folder)
  • start replacing .css files with .scss files

LESS

  • npm install --save-dev less less-loader@7 (inside your preact application folder)
  • start replacing .css files with .less files

Using Environment Variables

You can reference and use any environment variable in your application that has been prefixed with PREACT_APP_ automatically:

src/index.js

console.log(process.env.PREACT_APP_MY_VARIABLE);

If your variable is not prefixed, you can still add it manually by using your preact.config.js (see DefinePlugin config in the recipes wiki).

It's important to note that DefinePlugin does direct text replacement; it does not make process usable. process.env could be an empty object, yet process.env.PREACT_APP_MY_VARIABLE will still get automatically replaced (if a value exists).

You can set and store variables using a .env file in the root of your project:

.env

PREACT_APP_MY_VARIABLE="my-value"

You can also reference environment variables in your preact.config.js:

export default (config, env, helpers, options) => {
	if (process.env.MY_VARIABLE) {
		/** You can add a config here that will only used when your variable is truthy **/
	}
};

Route-Based Code Splitting

"Route" components are automatically code-splitted at build time to create smaller bundles and avoid loading more code than is needed by each page. This works by intercepting imports for route components with an async loader, which returns a lightweight wrapper component that handles code splitting seamlessly.

Automatic code splitting is applied to all JavaScript and TypeScript files in the following locations:

PatternExamples
src/routes/NAME
src/routes/home.js
src/routes/about/index.tsx
src/components/routes/NAME
src/components/routes/profile.ts
src/components/routes/profile/index.js
src/components/async/NAME
src/components/async/profile.ts
src/components/async/profile/index.js

Note: Automatic code splitting only supports default exports, not named exports:

- import { Profile } from './routes/profile';
+ import Profile from './routes/profile';

This is an intentional limitation that ensures effective code splitting. For components that need named exports, place them in a directory that doesn't trigger automatic code splitting. You can then manually code-split the default export by re-exporting it from routes/ or importing it with the "async!" prefix.

More Repositories

1

preact

⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM.
JavaScript
36,018
star
2

wmr

👩‍🚀 The tiny all-in-one development tool for modern web apps.
JavaScript
4,924
star
3

signals

Manage state with style in every framework
TypeScript
2,105
star
4

preact-router

🌎 URL router for Preact.
JavaScript
972
star
5

preact-compat

ATTENTION: The React compatibility layer for Preact has moved to the main preact repo.
JavaScript
951
star
6

awesome-preact

A curated list of amazingly awesome things regarding Preact ecosystem 🌟
848
star
7

preact-render-to-string

📄 Universal rendering for Preact: render JSX and Preact components to HTML.
JavaScript
574
star
8

compressed-size-action

GitHub Action that adds compressed size changes to your PRs.
JavaScript
541
star
9

next-plugin-preact

Next.js plugin for preact X
JavaScript
391
star
10

prefresh

Hot Module Reloading for Preact
JavaScript
351
star
11

preact-www

📖 Preact documentation website.
JavaScript
348
star
12

preact-custom-element

Wrap your component up as a custom element
JavaScript
343
star
13

preact-devtools

Browser extension for inspection Preact applications
TypeScript
295
star
14

preset-vite

Preset for using Preact with the vite bundler
TypeScript
233
star
15

eslint-config-preact

Unopinionated baseline ESLint config for Preact and Preact CLI codebases.
JavaScript
85
star
16

enzyme-adapter-preact-pure

Preact adapter for the Enzyme UI testing library
TypeScript
67
star
17

preact-ssr-prepass

Drop-in replacement for react-ssr-prepass
JavaScript
47
star
18

preact-integrations

A collection of sample apps demonstrating Preact's compatibility with various 3rd party libraries
JavaScript
35
star
19

rfcs

RFCs for changes and ideas in relation to Preact
30
star
20

create-preact

Create a Vite-powered Preact app in seconds
JavaScript
24
star
21

babel-plugin-transform-replace-expressions

A Babel plugin for replacing expressions with other expressions
JavaScript
23
star
22

jest-preset-preact

Jest preset for testing Preact apps
JavaScript
19
star
23

babel-plugin-transform-rename-properties

A Babel plugin for renaming JavaScript properties
JavaScript
19
star
24

preact-netlify

Preact's netlify CMS template
JavaScript
16
star
25

legacy-compat

React 15 compatibility layer for Preact
JavaScript
16
star
26

playwright-ct

Preact adapter for Playwright Component testing
TypeScript
15
star
27

preact-iso

Isomorphic utilities for Preact
JavaScript
12
star
28

compat-alias-package

JavaScript
10
star
29

babel-plugin-transform-hook-names

Add custom hook names for devtools
TypeScript
7
star
30

migrate-preact-x

JavaScript
6
star
31

preact-cli-experiment

TypeScript
4
star
32

codesandbox-template

JavaScript
4
star
33

.github

Default community files for the PreactJS organization
3
star