Convert Figma logo to code with AI

preactjs logopreact-cli

😺 Your next Preact PWA starts in 30 seconds.

4,680
376
4,680
76

Top Related Projects

Set up a modern web app by running one command.

29,757

🛠️ webpack-based tooling for Vue.js Development

CLI tool for Angular

78,194

Cybernetically enhanced web apps

124,777

The React Framework

55,199

The best React-based framework with performance, scalability and security built in.

Quick Overview

Preact CLI is a command-line tool for creating and managing Preact applications with minimal configuration. It provides a streamlined development experience, offering features like automatic code splitting, pre-rendering, and progressive web app (PWA) capabilities out of the box.

Pros

  • Quick setup and minimal configuration required
  • Built-in optimizations for performance, including code splitting and pre-rendering
  • Seamless integration with Preact ecosystem and compatible with many React libraries
  • Includes PWA features by default, making it easy to create offline-capable applications

Cons

  • Limited customization options compared to more flexible build tools
  • May have a steeper learning curve for developers new to Preact or modern build tools
  • Some advanced features or configurations may require additional setup or plugins

Getting Started

To get started with Preact CLI, follow these steps:

  1. Install Preact CLI globally:

    npm install -g preact-cli
    
  2. Create a new Preact project:

    preact create my-project
    
  3. Navigate to the project directory and start the development server:

    cd my-project
    npm start
    

Your Preact application will now be running on http://localhost:8080.

Code Examples

  1. Creating a simple Preact component:
import { h } from 'preact';

const Greeting = ({ name }) => (
  <div>Hello, {name}!</div>
);

export default Greeting;
  1. Using Preact hooks for state management:
import { h } from 'preact';
import { useState } from 'preact/hooks';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default Counter;
  1. Implementing routing with Preact Router:
import { h } from 'preact';
import { Router } from 'preact-router';

import Home from './routes/home';
import Profile from './routes/profile';

const App = () => (
  <Router>
    <Home path="/" />
    <Profile path="/profile/:user" />
  </Router>
);

export default App;
  1. Using async/await with Preact:
import { h } from 'preact';
import { useState, useEffect } from 'preact/hooks';

const UserList = () => {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    const fetchUsers = async () => {
      const response = await fetch('https://api.example.com/users');
      const data = await response.json();
      setUsers(data);
    };
    fetchUsers();
  }, []);

  return (
    <ul>
      {users.map(user => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
};

export default UserList;

Competitor Comparisons

Set up a modern web app by running one command.

Pros of Create React App

  • Larger ecosystem and community support
  • More comprehensive documentation and tutorials
  • Better integration with React-specific tools and libraries

Cons of Create React App

  • Larger bundle size and slower initial load times
  • Less flexibility for custom configurations without ejecting
  • Steeper learning curve for beginners due to more complex setup

Code Comparison

Create React App:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

Preact CLI:

import { h, render } from 'preact';
import App from './components/app';

render(<App />, document.body);

The main differences in the code snippets are:

  1. Create React App uses React and ReactDOM, while Preact CLI uses Preact's h and render functions.
  2. Create React App renders to a specific DOM element, while Preact CLI renders directly to the document body.
  3. The import statements differ slightly due to the different library structures.

Both tools aim to simplify the process of setting up a new project, but Create React App is more focused on the React ecosystem, while Preact CLI is designed for the lighter-weight Preact library.

29,757

🛠️ webpack-based tooling for Vue.js Development

Pros of vue-cli

  • More comprehensive tooling and plugin ecosystem
  • Better support for TypeScript out of the box
  • Offers a graphical user interface for project management

Cons of vue-cli

  • Larger bundle size and potentially slower build times
  • Steeper learning curve for beginners
  • More complex configuration options

Code Comparison

vue-cli:

vue create my-project
cd my-project
vue add vuex
vue add router
npm run serve

preact-cli:

preact create my-project
cd my-project
preact watch

Vue CLI offers more built-in features and configuration options, while Preact CLI focuses on simplicity and lightweight builds. Vue CLI provides a more comprehensive development environment with features like Vue Router and Vuex integration, whereas Preact CLI aims for a minimal setup that can be extended as needed.

Vue CLI's project structure is more opinionated and includes more files by default, while Preact CLI generates a leaner project structure. This difference reflects the overall philosophy of each framework: Vue.js aims to be a full-featured framework, while Preact focuses on being a lightweight alternative to React.

Both CLIs offer hot module replacement and production builds, but Vue CLI provides more advanced features like built-in TypeScript support and a plugin system for extending functionality.

CLI tool for Angular

Pros of Angular CLI

  • More comprehensive tooling and features for large-scale applications
  • Robust dependency management and update system
  • Extensive documentation and community support

Cons of Angular CLI

  • Steeper learning curve due to complexity
  • Larger bundle sizes and potentially slower initial load times
  • More opinionated structure, which may limit flexibility for some projects

Code Comparison

Angular CLI project generation:

ng new my-angular-app
cd my-angular-app
ng serve

Preact CLI project generation:

npx preact-cli create default my-preact-app
cd my-preact-app
npm start

Angular CLI offers more built-in commands and configuration options, while Preact CLI focuses on simplicity and quick setup. Angular CLI provides a more structured approach to building large-scale applications, whereas Preact CLI aims for a lightweight and flexible development experience.

Angular CLI is better suited for complex enterprise applications with extensive features, while Preact CLI is ideal for smaller projects or applications where performance and bundle size are critical. The choice between the two depends on project requirements, team expertise, and desired application complexity.

78,194

Cybernetically enhanced web apps

Pros of Svelte

  • Smaller bundle sizes due to compile-time optimization
  • More intuitive reactivity model with less boilerplate
  • Built-in state management and animation capabilities

Cons of Svelte

  • Smaller ecosystem and community compared to Preact
  • Less mature tooling and third-party library support
  • Steeper learning curve for developers familiar with React-like syntax

Code Comparison

Svelte component:

<script>
  let count = 0;
  function increment() {
    count += 1;
  }
</script>

<button on:click={increment}>
  Clicks: {count}
</button>

Preact component:

import { h } from 'preact';
import { useState } from 'preact/hooks';

export default function Counter() {
  const [count, setCount] = useState(0);
  const increment = () => setCount(count + 1);
  return <button onClick={increment}>Clicks: {count}</button>;
}

Svelte's syntax is more concise and requires less boilerplate compared to Preact. The reactivity is built into the language, eliminating the need for explicit state management hooks. Preact, being closer to React, uses a more familiar JSX syntax and hooks-based approach, which may be more comfortable for developers coming from a React background.

124,777

The React Framework

Pros of Next.js

  • Larger ecosystem and community support
  • Built-in server-side rendering and static site generation
  • Seamless integration with Vercel's deployment platform

Cons of Next.js

  • Steeper learning curve for beginners
  • Larger bundle size compared to Preact CLI
  • More opinionated structure, which may limit flexibility

Code Comparison

Next.js:

// pages/index.js
export default function Home() {
  return <h1>Welcome to Next.js!</h1>
}

Preact CLI:

// src/components/app.js
export default function App() {
  return <h1>Welcome to Preact!</h1>
}

Both Next.js and Preact CLI offer simple ways to create components and pages. Next.js uses a file-based routing system, while Preact CLI typically relies on a single entry point with client-side routing.

Next.js provides more built-in features and optimizations out of the box, making it suitable for larger, more complex applications. Preact CLI, on the other hand, focuses on simplicity and small bundle sizes, making it ideal for lightweight projects or when performance is a top priority.

Ultimately, the choice between Next.js and Preact CLI depends on the specific requirements of your project, team expertise, and desired features.

55,199

The best React-based framework with performance, scalability and security built in.

Pros of Gatsby

  • Extensive plugin ecosystem for integrating various data sources and functionalities
  • Strong focus on performance optimization, including image processing and lazy loading
  • Robust documentation and large community support

Cons of Gatsby

  • Steeper learning curve, especially for developers new to GraphQL
  • Longer build times for large sites compared to Preact CLI
  • Higher memory usage during development and build processes

Code Comparison

Gatsby (JavaScript):

import React from "react"
import { Link } from "gatsby"

export default function Home() {
  return <Link to="/about/">About</Link>
}

Preact CLI (JavaScript):

import { h } from 'preact';
import { Link } from 'preact-router/match';

export default function Home() {
  return <Link href="/about/">About</Link>;
}

Both examples show a simple component with a link, but Gatsby uses React and its own Link component, while Preact CLI uses Preact's h function and a different Link component from preact-router.

Gatsby offers more built-in features and a larger ecosystem, making it suitable for complex projects. Preact CLI, being lighter and faster, is ideal for simpler applications or when performance is a top priority. The choice between them depends on project requirements and developer preferences.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

preact-cli NPM Downloads NPM Version

[!WARNING] preact-cli unfortunately no longer sees active development! It's stable so you can rely upon it for all of your existing apps, but for creating new ones, we recommend Vite via create-preact. It offers many of the same features but is a much faster, more modern experience. Thanks to all the contributors and users over the years!

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 >= v14.14 is required.

Usage

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

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

Example:

$ npm init preact-cli default my-project

The above command pulls the template from preactjs-templates/default 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 npm init preact-cli <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:
npm init preact-cli <username>/<repository> <project-name>

CLI Options

preact list

Lists all the official preactjs-cli repositories

$ [npm init / yarn create] preact-cli list

preact create

Create a project to quick start development.

$ [npm init / yarn create] preact-cli <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]
  --git         Initialize version control using git.                 [boolean] [default: false]
  --install     Installs dependencies.                                [boolean] [default: true]

preact build

Create a production build

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

$ [npm run / yarn] preact build

    --src              Specify source directory  (default src)
    --dest             Specify output directory  (default build)
    --cwd              A directory to use instead of $PWD  (default .)
    --sw               Generate and attach a Service Worker  (default true)
    --babelConfig      Path to custom Babel config (default .babelrc)
    --prerender        Renders route(s) into generated static HTML  (default true)
    --prerenderUrls    Path to pre-rendered routes config  (default prerender-urls.json)
    --template         Path to custom EJS or HTML template  (default 'src/template.ejs')
    --analyze          Launch interactive Analyzer to inspect production bundle(s) (default false)
    -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

$ [npm run / yarn] preact watch

    --src              Specify source directory  (default src)
    --cwd              A directory to use instead of $PWD  (default .)
    --clear            Clear the console (default true)
    --sw               Generate and attach a Service Worker  (default false)
    --babelConfig      Path to custom Babel config (default .babelrc)
    --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 EJS or HTML template  (default 'src/template.ejs')
    --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 info

Prints debugging information concerning the local environment.

$ [npm run / yarn] preact info

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 legacy JavaScript (via @babel/preset-env) and your CSS (via autoprefixer) output.

By default, preact-cli emulates the following config:

package.json

{
	"browserslist": ["> 0.5%", "last 2 versions", "Firefox ESR", "not dead"]
}

Babel

To customize Babel, you have two options:

  1. You may create a .babelrc file in your project's root directory, or use the --babelConfig path to point at any valid Babel config file. Any settings you define here will be merged into the Preact CLI preset. For example, if you pass a "plugins" object containing different plugins from those already in use, they will simply be added on top of the existing config. If there are conflicts, you'll want to look into option 2, as the default will take precedence.

  2. If you'd like to modify 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's Webpack config, 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

To customize the HTML document that your app uses, edit the template.ejs file in your app's source directory.

EJS is a simple templating language that lets you generate HTML markup with plain JavaScript. Alongside html-webpack-plugin, you're able to conditionally add HTML, access your bundles and assets, and link to external content if you wish. The default we provide on project initialization should fit the majority of use cases very well, but feel free to customize!

You can customize the location of your template with the --template flag on the build and watch commands:

preact build --template renamed-src/template.ejs
preact watch --template template.ejs

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.

NPM DownloadsLast 30 Days