(WIP) Universal PWA Builder

Related tags

Boilerplates pwa
Overview
PWA

WORK IN PROGRESS


Features

  • Framework Agnostic
    Build with your preferred framework or with none at all!
    Official presets for Preact, React, Vue, and Svelte.

  • Plug 'n Play
    Don't worry about configuration, unless you want to.
    Presets and plugins are automatically applied. Just install and go!

  • Fully Extensible
    Includes a plugin system that allows for easy, fine-grain control of your configuration... when needed.

  • Feature Rich
    Supports Babel, Bublé, Browserslist, TypeScript, PostCSS, ESLint, Prettier, and Service Workers out of the box!

  • Instant Prototyping
    Quickly scaffold new projects with your preferred view library and toolkit.
    Kick it off with a perfect Lighthouse score!

  • Static Site Generator
    Export your routes as "pre-rendered" HTML.
    Great for SEO and works on any static hosting service.

Installation

PWA is split up into two main components (core and cli) in addition to its list of presets and plugins.

While most will opt for the CLI, the core module handles all configuration and can be used as a standalone module.

Please refer to each package for installation, API, and Usage information.

Quick Start

# Install globally
$ npm install --global @pwa/cli
# OR
$ yarn global add @pwa/cli

# Display CLI's help text
$ pwa --help

# Generate new project
$ pwa init

Note: The global modifiers are only required for global command-line usage!
Local devDependency installation will also work, but then pwa usage is limited to the project.

Concepts

Please read about Progressive Web Apps if the term is unfamiliar to you.

Presets

Presets are collections of plugins that are tailored for a particular framework.

While there may be "official" presets, this does not mean that PWA can only support these candidates! The current options are:

These packages are auto-loaded during PWA's initialization and are applied first, before any Plugins or custom configuration. This means that you always have the option to override a value or setting shipped within the Preset.

Plugins

Plugins are (typically) individual features or chunks of configuration that are encapsulated for easy/automatic application within your build process.

While there may be "official" plugins, this does not mean that PWA can only support these functionalities! The current plugins include:

These packages are auto-loaded during PWA's initialization and are applied second, after any Presets and before custom configuration. This allows Plugins to override settings from Presets.

Plugins may (sometimes) expose a new key on the config tree and then reference this value later in composition. This allows the end-user to change the Plugin's settings before running the build.

Please see @pwa/plugin-critters for an example of this practice.

Commands

This section applies to @pwa/cli specifically.

Build

Build your application for production

$ pwa build --help

  Description
    Build production assets

  Usage
    $ pwa build [src] [options]

  Options
    --analyze     Launch interactive Analyzer to inspect production bundle(s)
    -o, --dest    Path to output directory  (default build)
    -h, --help    Displays this message

Export

Export routes' HTML for static hosting

Instead of --routes, you may define a routes array within pwa.config.js config file.

If no routes are defined in either location, PWA will traverse your "@pages"-aliased directory (default: src/pages/**) and attempt to infer URL patterns from the file structure.

In the event that no files exist within that directory, PWA will show a warning but still scrape the index ("/") route.

$ pwa export --help

  Description
    Export pre-rendered pages

  Usage
    $ pwa export [src] [options]

  Options
    -o, --dest        Path to output directory  (default build)
    -w, --wait        Time (ms) to wait before scraping each route  (default 0)
    -r, --routes      Comma-delimited list of routes to export
    -i, --insecure    Launch Chrome Headless without sandbox
    -h, --help        Displays this message

Important: Using export requires a local version of Chrome installed! See chrome-launcher.
Additionally, the --insecure flag launches Chrome without sandboxing. See here and here for help.

Watch

Develop within a live-reload server

Within your pwa.config.js's webpack config, any/all devServer options are passed to Webpack Dev Server.

$ pwa watch --help

  Description
    Start development server

  Usage
    $ pwa watch [src] [options]

  Options
    -H, --host     A hostname on which to start the application  (default localhost)
    -p, --port     A port number on which to start the application  (default 8080)
    -q, --quiet    Disable logging to terminal, including errors and warnings
    --https        Run the application over HTTP/2 with HTTPS
    --key          Path to custom SSL certificate key
    --cert         Path to custom SSL certificate
    --cacert       Path to custom CA certificate override
    -h, --help     Displays this message

Build vs Export

Export can be thought of as "Build 2.0" — it spins up a Headless Chrome browser and programmatically scrapes your routes.

This is ideal for SEO, PWA behavior, and all-around performance purposes, as your content will exist on the page before the JavaScript application is downloaded, parsed, boots, and (finally) renders the content.

The generated HTML pages will be placed in your build directory. A /login route will be exported as build/login/index.html — this makes it compatible with even the "dumbest" of static hosting services!

Note: Running export will automatically run build before scraping.

Configuration

Overview

All configuration within the PWA tree is mutable! Presets, Plugins, and your custom config file write into the same object(s). This is great for composability and extensibility, but be warned that your custom config may break the build if you're not careful.

💡 Official presets & plugins are controlled releases and are ensured to play nicely with one another.

The config object(s) for your project are assembled in this sequence:

  1. Presets: All non-webpack config keys
  2. Plugins: All non-webpack config keys
  3. Custom: All non-webpack config keys
  4. Presets: The webpack config key, if any
  5. Plugins: The webpack config key, if any
  6. Custom: The webpack config key, if any

Because the final config object is passed to Webpack, internally, the webpack key always runs last as it composes & moves everything into its relevant loaders, plugins, etc.

Important: When defining a custom webpack key it must always be a function!

Mutations

Every config key can be defined or mutated in the same way!

Any non-Function key will overwrite the existing value. This allows strong opinions and/or allows a Plugin to define a new config key and reference it later on.

Any Function key will receive the existing, matching config-value for direct mutation. This is for fine-grain control over the existing config.

// defaults:
exports.hello = { foo:1, bar:2 };
exports.world = ['How', 'are', 'you?'];

// preset/plugin/custom:
exports.hello = function (config) {
  config.bar = 42;
  config.baz = [7, 8, 9];
}
exports.world = ['I', 'am', 'fine'];
exports.HOWDY = 'PARTNER!';

// result:
exports.hello = {
  foo: 1,
  bar: 42,
  baz: [7, 8, 9]
}
exports.world = ['I', 'am', 'fine'];
exports.HOWDY = 'PARTNER!';

Functions

Any config key that is a function will have the signature of (config, env, opts).

config

Type: Mixed

This will be the existing value for the current key. It will typically be an Object, but not always.

It will also be undefined if/when defining a new config key — if you know that to be the case, you shouldn't be using a Function~!

env

Type: Object

Will be the environmental values for this command.
This is passed from @pwa/core's options.

The env.cwd, env.src, env.dest, env.log, env.production and env.webpack keys are always defined.
Anything else is contextual information for the current command being run.

opts

Type: Object

Direct access to configuraton keys, except webpack.

As an example, this can be used within a Plugin for gaining insight or gaining access to other packages' settings.

The default config keys (except webpack) will always be present here.

Config Keys

The following keys are defined by default within every PWA instance. You may mutate or compose with them accordingly.

babel

Type: Object
Default: Link

Your Babel config object.

css

Type: Object
Default: Link

Core CSS behavior — see css-loader for options.

html

Type: Object
Default: Link

Your HTML plugin configuration — see html-webpack-plugin for options.

less

Type: Object
Default: Link

Any less-loader options — see less-loader for documentation.

Note: This is the entire loader config; you may need to include the lessOptions nested object.

postcss

Type: Object
Default: Link

Your PostCSS config — you may also use any config file/method that postcss-loader accepts.

Important: The postcss.plugins key cannot be a function!

sass

Type: Object
Default: Link

Any sass-loader options — see sass-loader for documentation.

This object will be used for both .scss and .sass file extensions.
The .sass extension will automatically enforce the indentedSyntax option.

Note: This is the entire loader config; you may need to include the sassOptions nested object.

stylus

Type: Object
Default: Link

Any stylus-loader options — see stylus-loader for documentation.

terser

Type: Object
Default: Link

The options for Terser Plugin.

Note: Expecting UglifyJS? It's no longer maintained!
The Terser configuration is nearly identical – simply rename uglifyOptions to terserOptions 👍

webpack

Type: Function

The main handler for all of PWA!
When you define a custom webpack, you are not overriding this function. Instead, you are manipulating Webpack's config immediately before PWA executes the build.

Browserslist

The preferred method for customizing your browser targets is thru the browserslist key within your package.json file.

Note: When creating a new project with pwa init, our recommended config is automatically added for you!

You may choose to change the default values, or use any configuration method that Browserslist accepts.

The resulting array of browser targets will be automatically applied to Autoprefixer, Babel, Bublé, PostCSS, Stylelint, ...etc.

Customizing

Presets and Plugins are just encapsulated config mutations — that's it!

Now, if you want to further customize your PWA build, beyond what your installed Presets & Plugins are giving you, then you can create a pwa.config.js in your project's root directory.

Note: Your new pwa.config.js file should sit alongside your package.json 👍

With this file, you may mutate or compose any of the config keys that either PWA or its Plugins exposes to you.

Here is an example custom config file:

// pwa.config.js
const OfflinePlugin = require('offline-plugin');

// Mutate "@pwa/plugin-eslint" config
exports.eslint = function (config) {
  config.formatter = require('eslint-friendly-formatter');
};

// Add new PostCSS Plugin
exports.postcss = function (config) {
  config.plugins.push(
    require('postcss-flexbugs-fixes')
  );
};

// Export these pages during "pwa export" command
exports.routes = ['/login', '/register', '/articles/hello-world'];

// Update Webpack config; ENV-dependent
exports.webpack = function (config, env) {
  let { production, webpack } = env;

  if (production) {
    config.plugins.push(
      new OfflinePlugin(),
      new webpack.DefinePlugin({
        MY_API: JSON.stringify('https://api.example.com')
      })
    );
  } else {
    config.devServer.https = true;
    config.plugins.push(
      new webpack.DefinePlugin({
        MY_API: JSON.stringify('http://staging.example.com')
      })
    );
  }
};

Credits

A huge thank-you to Jimmy Moon for donating the @pwa organization on npm! 🙌 Aside from being the perfect name, we wouldn't be able to have automatic preset/plugin resolution without a namespace!

Incredible thanks to the giants whose shoulders this project stands on~! ❤️

PWA was originally conceived in 2016 but at that time, it wasn't yet possible to build it with the feature set I had in mind. Since then, an amazing amount of work has been done on Webpack and its ecosystem, which now makes the project goals feasible.

There's no question that PWA takes inspiration from popular CLI applications, like Preact CLI, Vue CLI, and Create React App. They most definitely paved the way. I've used, learned from, and refined my wishlist over years while using these tools. Despite their greatness, I still found a need for a universal, framework-agnostic PWA builder that could unify all these great libraries.

License

MIT © Luke Edwards

Comments
  • export fails in container, connecting to different port than the start port

    export fails in container, connecting to different port than the start port

    I'm not sure why the server started on port 36573 but somehow, it's connecting to 33435

    I'm having this issue in container though, not on my local machine.

    [PWA] Started local server on http://localhost:36573
    (node:6) UnhandledPromiseRejectionWarning: Error: connect ECONNREFUSED 127.0.0.1:33435
        at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1161:14)
    (node:6) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
    (node:6) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled willterminate the Node.js process with a non-zero exit code.
    
    
    more info 
    opened by tuananh 13
  • Custom postcss webpack style rules missing with pwa.config.js

    Custom postcss webpack style rules missing with pwa.config.js

    TLDR; missing access to preprocessors options with pwa.config.js

    I'm wondering how I could add custom postcss style rules to the webpack configuration.

    Although, I didn't figured out where lives the code for pwa.config.js yet, I actually found there was no clean way to add custom postcss plugins use rules https://github.com/lukeed/pwa/blob/71bd9595395c2e4eeeb8ddb07c0b2a7242e4b896/packages/core/webpack/style.js#L25-L32

    One way to work around this limitation as suggested by https://github.com/lukeed/pwa/blob/71bd9595395c2e4eeeb8ddb07c0b2a7242e4b896/packages/core/webpack/style.js#L78-L79 and https://github.com/lukeed/pwa/blob/71bd9595395c2e4eeeb8ddb07c0b2a7242e4b896/packages/core/webpack/style.js#L3-L6

    would be searching for weback's rules where use.length > 0 and use[use.length-1].loader === ext + '-loader' in pwm.config.js and in order to update the options within the last item of the use object.

    Thus, I wonder if it wouldn't be possible to pass options from mutation of an object similarly to postcss array for instance as there is only one preprocessor used in general.

    As I didn't figured out how pwa.config.js is interpreted under the hood I don't know yet how to pass options to webpack/style.js. Though I hope it is feasible.

    opened by malikbenkirane 8
  • Change default browsers

    Change default browsers

    It is me again with the issue about Browserslist. Hope I didn’t bother you with it 😅

    Current browsers are (according to Jamie’s article)

    >0.25%, not ie 11, not op_mini all
    

    Unfortunately, this article was not created with good analysis behind.

    Here I bring developers around the world and they say that Jamie’s target browsers settings could cut the whole countries from the Internet https://github.com/browserslist/browserslist/issues/250

    Personally, I see people use Opera Mini everyday here. In the streets, in cafes, in buses, everywhere you can think of.

    Here are Browserslist’s official recommendations

    1. Select browsers directly (last 2 Chrome versions) only if you are making a web app for a kiosk with one browser. There are a lot of browsers on the market. If you are making general web app you should respect browsers diversity.
    2. If you want to change the default set of browsers we recommend to combine last 1 version, not dead with > 0.2% (or > 1% in US, > 1% in my stats). last n versions adds too many dead browsers and does not add popular old versions. > 0.2% make popular browsers even more popular, so we will have a monopoly and stagnation, as we had with Internet Explorer 6.
    3. Don’t remove browsers just because you don’t know them. Opera Mini has 100 million users in Africa and it is more popular in the global market than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox and desktop Safari altogether.

    The default query defaults (or > 0.5%, last 2 versions, Firefox ESR, not dead) is very balanced. If you want to keep bundle smaller, but still be open for everyone in the world, I can suggest:

    > 1%, last 1 version, not ie 11, not ie_mob 11, not dead
    
    opened by ai 8
  • Browserslist config

    Browserslist config

    Right now we have browsers option in config. And we pas it to Babel and Autoprefixer.

    Unfortunately, Babel and Autoprefixer are not the only Browserslist clients. optimize-css-assets-webpack-plugin (CSS minifier which is used in this project) uses Browserslist too. Also there is many PostCSS plugins, ESLint plugins and Stylleint plugins, which use Browserslist too.

    I think the only way here is to keep target browsers in standard place — .browserslistrc or browserslist key in package.json.

    Migration plan:

    1. Add "browserslist": ["defaults"] to package.json generator
    2. Add warning on config.browsers, which will ask users to move browsers.
    3. In next major version, throw a error on config.browsers

    What do you think? Yeap, I know it is always bad news when cool API faced problems like this.

    opened by ai 8
  • Hot Module Reloading doesn't work out of the box?

    Hot Module Reloading doesn't work out of the box?

    I ran pwa init and created a new React app. Then I ran pwa serve which output:

    λ pwa watch
    [PWA] Applying preset: @pwa/preset-react
    [PWA] Starting development server on http://localhost:8080
    [PWA] Rebuilt in 4.77s
    

    After I modified one of the React component, it said:

    [PWA] File changed: src\components\App\index.js
    [PWA] Rebuilt in 1.60s
    

    And I saw this in the browser console:

    [WDS] App updated. Recompiling...
    [WDS] App hot update...
    

    However the page wasn't hot-reloaded and I had to refresh to see the changes.

    Is that expected?

    Windows 10.0.17134.228 Firefox 61.0.2

    more info 
    opened by Daniel15 7
  • Installation misses directories and files

    Installation misses directories and files

    npm init

    ✔ Which framework would you like to use? › React
    ✔ Select features needed for your project: › 
    ✔ Directory to use … .
    ✔ Are you sure you want to write into the current directory? … no
    ✔ OK. Please provide another directory. … test
    (node:9360) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, scandir '~/.nvm/versions/node/v10.9.0/lib/node_modules/@pwa/cli/templates/assets'
    

    Installation misses the following:

    • assets
    • css
    • index.html
    • .gitignore

    (manually copying them solves the issue)

    node -v 10.9.0
    npm -v 6.4.1
    
    opened by maxdevjs 7
  • React Installed brand new, not working straight up.

    React Installed brand new, not working straight up.

    Repro steps

    • Use windows.
    • Install globally
    • Create a project with offline plugin, React and eslint
    • yarn build

    error:

    [PWA] Deleted existing build directory
    (node:9852) UnhandledPromiseRejectionWarning: Error: original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.
        at SourceMapGenerator_validateMapping [as _validateMapping] (C:\xxx\checkout-new\node_modules\source-map\lib\source-map-generator.js:276:15)
    
    opened by bovas85 5
  • Handle LauncherError exception

    Handle LauncherError exception

    During pwa export:

    [PWA] Started local server on http://localhost:49393
    (node:26485) UnhandledPromiseRejectionWarning: Error
        at new LauncherError (/Users/artim.sapegin/_/coffeetimer/node_modules/chrome-launcher/dist/utils.js:35:22)
        at new ChromeNotInstalledError (/Users/artim.sapegin/_/coffeetimer/node_modules/chrome-launcher/dist/utils.js:66:9)
        at Launcher.<anonymous> (/Users/artim.sapegin/_/coffeetimer/node_modules/chrome-launcher/dist/chrome-launcher.js:145:27)
        at Generator.next (<anonymous>)
        at fulfilled (/Users/artim.sapegin/_/coffeetimer/node_modules/chrome-launcher/dist/chrome-launcher.js:9:58)
        at process._tickCallback (internal/process/next_tick.js:68:7)
    (node:26485) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
    (node:26485) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    

    Expected behavior

    1. Show a readable error message.
    2. Terminate the process.

    P. S. Weird thing that I have Chrome installed ;-/

    opened by sapegin 4
  • Customize SSR

    Customize SSR

    Hi @lukeed,

    Thanks for this amazing project, it sounds really exciting :)

    I'm playing a little bit with it and I'm wondering if there's a technique to customise the way the pages are server rendered?

    For instance, in projects like Razzle, you have access to a server.js file where you can customize the code. With this approach, you can support libraries like styled-components, Apollo etc...

    Currently, I don't see anything in the doc that could support that. Did I miss something or is there a plan to support that in the future?

    question 
    opened by tatchi 4
  • Watch: `--https` flag overrides custom config

    Watch: `--https` flag overrides custom config

    i have this line in pwa.config.js

    config.devServer.https = true
    

    however, when i browse to https://localhost:8080 it shows ERR_SSL_PROTOCOL_ERROR

    Do you have any idea why it happens? should i bring this to webpack devserver repo instead?

    bug 
    opened by tuananh 4
  • Development server always start on port 80

    Development server always start on port 80

    Hi,

    maybe I'm missing something, but on my system, with a fresh installation, running watch always try to bind to localhost:80 (I see the debug message [PWA] Starting development server on http://localhost:80.

    I tried with pwa watch --port 9090 and with this pwa.config.js in the root of the project:

      config.devServer.port = 9090;
    };```
    
    My current setup:
    
    OSX 10.10.5
    node v8.11.0
    npm 5.6.0
    
    Thanks in advance!
    
    Gennaro
    more info 
    opened by kesonno 4
  • pnpm install

    pnpm install

    Is there still any known issue with pnpm like it was earlier mentioned?

    > pnpm watch
    
    [PWA] Applying preset: @pwa/preset-svelte
    [PWA] Starting development server on http://localhost:8080
    [PWA] Failed to compile! Found 1 error:
          multi ./index.js ../node_modules/.pnpm/[email protected]/node_modules/webpack-dev-server/client/index.js ../node_modules/.pnpm/[email protected]/node_modules/webpack/hot/dev-server.js
          Module not found: Can't resolve 'babel-loader' in '$HOME/path-to-root/src'
    

    Analogous error message running directly pwa init (still globally installed with pnpm add -g @pwa/cli)

    opened by AleCandido 0
  • npm i missing from docs

    npm i missing from docs

    Hi Luke

    I know, this is not an issue, but it's actually essential for someone new, trying to learn. After pwa init, the docs should have this two essential lines:

    • cd project-name
    • npm i And then pwa watch.

    Great work BTW 👍

    opened by toporan 0
  • Config for supplying own service worker file

    Config for supplying own service worker file

    I tried to understand the custom config options for pwa.config.js, but could not find a way to get the workbox options (particularly, which swSrc applied in my build.

    the config file looks like this right now:

    exports.workbox = {
        advanced: false, // alias
        injectManifest: false, // alias
        swSrc: './service_worker.js', // template; mode: InjectManifest
        navigateFallbackWhitelist: [/^(?!\/__).*/], // mode: GenerateSW
        navigateFallback: 'index.html', // mode: GenerateSW
        swDest: 'sw.js',
        exclude: [
          /\.git/,
          /\.map$/,
          /\.DS_Store/,
          /^manifest.*\.js(?:on)?$/,
          /\.gz(ip)?$/,
          /\.br$/
        ]
      }
    

    thanks for any pointers!

    opened by lukasIO 0
  • Activating Open Collective

    Activating Open Collective

    Hi, I'm making updates for Open Collective. Either you or another core contributor signed this repository up for Open Collective. This pull request adds financial contributors from your Open Collective https://opencollective.com/pwa ❤️

    What it does:

    • adds a badge to show the latest number of financial contributors
    • adds a banner displaying contributors to the project on GitHub
    • adds a banner displaying all individuals contributing financially on Open Collective
    • adds a section displaying all organizations contributing financially on Open Collective, with their logo and a link to their website

    We have also added a postinstall script to let people know after npm|yarn install that you are welcoming donations. Feel free to remove it if you don't want it. [More info]

    P.S: As with any pull request, feel free to comment or suggest changes.

    Thank you for your great contribution to the Open Source community. You are awesome! 🙌 And welcome to the Open Collective community! 😊

    Come chat with us in the #opensource channel on https://slack.opencollective.com - great place to ask questions and share best practices with other Open Source sustainers!

    opened by monkeywithacupcake 0
Releases(v0.5.4)
  • v0.5.4(Apr 16, 2020)

    Patches

    • (cli.init) Scaffold new SASS/SCSS applications with [email protected] version: e0c0a30 Existing applications may want to upgrade their local sass-loader dependency.

    • (cli.init) Scaffold new Preact applications using Preact 10.x: ef6f96a

    Source code(tar.gz)
    Source code(zip)
  • v0.5.3(Apr 16, 2020)

    Patches

    • (core) Allow pwa export to access Chrome on OSX Catalina (#73): b8d3b22 Thank you @sapegin!

    • (core): Enable esModule option for css-loader branches: 4e30b47 This saves ~1kB in JS bundle size on the non-router scaffolds!

    • (core): Expose new sass, less, and stylus keys for pwa.config.js access (#71): 8a7b9ab Note: No change in previous config/behavior! Simply relocating the defaults.

    Chores

    • update eslint parser config: f026e4b
    • remove EHOIST_PKG_VERSION lerna warning: a89d9bd
    Source code(tar.gz)
    Source code(zip)
  • v0.5.0(Mar 31, 2020)

    Breaking

    • Dropped support for Node 6.x: 9ffdb89, 1417c02

    • Stylesheet references to webpack aliases syntax change: 03f20e0, 5d37039 This is due to css-loader upgrade & it forces specific syntax to reference aliases.

      /* before */
      background-image: url(@assets/gradient.png);
      
      /* after */
      background-image: url(~@assets/gradient.png);
      
    • Stop including eslint and prettier dependencies within respective plugins: 6cc1c9a You must install eslint and prettier directly; you control the version!

    Features

    • feat(NEW): Added TypeScript support via @pwa/plugin-typescript: 48c3321
    • feat(NEW): Added @pwa/plugin-imagemin package for image optimization: 97f0a4a
    • feat(cli): Scaffold TypeScript parts within pwa init walkthrough: e1fa8d7
    • feat(preact): Add graceful support for Preact X and Preact 8.x versions: b5e2ea0
    • feat(prettier): Require prettier@^2.0 peering: 6cc1c9a, 7e6eb1e, 1985420
    • feat(eslint): Require eslint@^6.8 peering: 6cc1c9a, d605076, 1985420

    Patches

    • fix(core): Do not force paths or includePaths options within style loaders: c68f509
    • fix(core): Use optimization.moduleIds (instead of plugin variant) so that it's easier to disable: 38c02fe
    • fix(core): Include default optimize-css-assets-webpack-plugin options for generalized usage: ebe5385
    • fix(core): use [chunkhash] in filename output templates: f38a71b
    • fix(core): update dependency versions: 47462d2, 914e9eb, 705effb, 5d37039, 109d50a
    • fix(cli): define missing preact-router version for template: c247148
    • fix(cli): mute webpack-dev-server noise: a53beaf
    • fix(preact): define & provide Fragment for Preact X: 4b3304d
    Source code(tar.gz)
    Source code(zip)
  • v0.4.2(Nov 22, 2018)

  • v0.4.1(Oct 13, 2018)

    Patches

    • (core) Extract config.css PWA config entry for easier css-loader changes: 3733cf3, 4cbc453

    • (core) Move devServer.contentBase Webpack override from cli: 3ac6011

    • (svelte) Disable CSS modules via new config.css route: f181d15

    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Oct 7, 2018)

    Breaking

    • Replaced UglisyJS with Terser (#49): 66f9d19 Especially with Babel@7's ability to target ESM output, this was a required change.

    • Replaced core browsers config with universal Browserslist locations (#47): b0c315b All tools are already attempting to locate config for these locations. No sense in reinventing.

    Features

    • (core) Upgraded to Babel 7.x dependencies! (#30): c97d6cb
    • (preact) Include async! loader for easy code-splitting (#51): 816db63, 6f56f4c
    • (cli.export) Include --insecure flag to disable sandboxing (#40): a194d2e

    Patches

    • (cli.init) Specify third-party dependency versions (#19): 2cb4640
    • (cli.export) Scrape root path last to prevent empty content: bf9feee
    • (templates) Fix <object/> descriptor for Lighthouse score: ded2fce, 0a05258
    • (core) Update default "browserslist" targets: 02ec952
    • (core) Bump dependencies: c745542, 26a11f5, 81876cd

    Chores

    • Prevent double TravisCI runs: c1dc80f
    • Update lerna to latest: 34773c3
    • Update README docs: 01bef33
    Source code(tar.gz)
    Source code(zip)
  • v0.3.2(Sep 16, 2018)

    Patches

    • (cli.init) Show Bublé within "Features" list if no argv.preset value: 7aa3f8e
    • (cli.init) Scaffold pwa/plugin-buble when selected: 2f5f569
    • (cli.init) Show, scaffold, and list Compression plugin options: 3146de1
    • (cli.init) Include preact-compat when Preact chosen as preset: 46b65b9
    • (cli.build) Do not run --analyze and export at the same time: 33f2fce
    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(Sep 11, 2018)

    Patches

    • (plugin-sw-workbox) Fix: Add missing comma (#39): b177de7
    • (plugin-sw-precache) Fix: Add missing comma: 719ab08
    • (templates/vanilla-router) Fix: App initialization: da891f2
    • (templates/vue-router) Fix: remove extra comma: da891f2
    • Remove unused variables and parameters: 719ab08, da891f2

    Chores

    • Attach ESLint with basic configuration: 2d1e66a
    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Sep 11, 2018)

    Features

    • NEW @pwa/plugin-brotli package: d1f679c
    • NEW @pwa/plugin-gzip package: 82d3b57
    • NEW @pwa/plugin-zopfli package: 66644e9
    • NEW @pwa/plugin-buble package: 862bdd5

    Patches

    • (core) Fix stylesheet imports from node_modules dir (#38): a963a5e
    • (cli) Handle empty values for the pretty util: d7e88a4

    Chores

    • Add initial tests for utilities: 2ed53f7, 87837ce, 741cc03
    • Port over template & style changes into website: 15595b5, 253cd6f, 7ed7d88
    • Update README: 06150b1, 078c4a7, 8d327ca, 92eeece
    Source code(tar.gz)
    Source code(zip)
  • v0.2.1(Sep 4, 2018)

    Patches

    • (cli) Fixed watch default flag values overriding custom config.devServer (#26): 3a0e7ac Applies to https, host, and port values.

      Flag values are supposed to override pwa.config.js keys, but only when actually specified. Default flag values are always there, whether or not the flag was passed. We look for config values if & only if the default is received.

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Sep 3, 2018)

    Features

    • NEW Finish all pwa init templates 🎉 : a6a74ca, 6499617
    • NEW @pwa/plugin-sw-precache package: fc1038e
    • NEW @pwa/plugin-sw-workbox package: fdc6875
    • NEW @pwa/plugin-offline package: 9cef447
    • (cli) Finish & attach "Service Worker" feature selection: c60b077

    Patches

    • Fix sass preprocessing for Svelte applications: 2730286
    • Add .app selector content to avoid unused/broken parsing: 08b7823
    • Fix: Remove duplicate error logging: a436fc8, f4b625b
    • Fix: Handle case when no stats output: a7cb8e1
    • Fix: Attach ganalytics to React template: fce0aeb
    • Use <object/> instead of <img/> for SVG container: 2eaf848
    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Sep 1, 2018)

  • v0.1.1(Sep 1, 2018)

Owner
Luke Edwards
Luke Edwards
✨ Create server-rendered universal JavaScript applications with no configuration

Universal JavaScript applications are tough to setup. Either you buy into a framework like Next.js or Nuxt, fork a boilerplate, or set things up yours

Jared Palmer 11k Jan 8, 2023
Full-Stack solution to quickly build PWA applications with Vue.js and Firebase

Welcome to bento-starter ?? ?? bento-starter is an Open-Source Full-Stack solution that helps you to build fast and maintainable web applications usin

Franck Abgrall 1.5k Jan 5, 2023
⚡️ Set up Next.js Progressive Web App with `npx create-next-pwa`

⚡️ create-next-pwa A cross-platform Node.js based CLI tool that creates Progressive Web App (PWA) with Next.js. You can also integrate tailwind with t

Saad Irfan ⚡️ 66 Nov 20, 2022
Vite Electron Builder Boilerplate

This is template for secure electron applications. Written following the latest safety requirements, recommendations and best practices.

Harry Hopkinson 4 Dec 15, 2022
(WIP) Universal PWA Builder

WORK IN PROGRESS Features Framework Agnostic Build with your preferred framework or with none at all! Official presets for Preact, React, Vue, and Sve

Luke Edwards 3.1k Dec 26, 2022
Persistent key/value data storage for your Browser and/or PWA, promisified, including file support and service worker support, all with IndexedDB. Perfectly suitable for your next (PWA) app.

BrowstorJS ?? ?? ?? Persistent key/value data storage for your Browser and/or PWA, promisified, including file support and service worker support, all

Nullix 8 Aug 5, 2022
🐰 Rax is a progressive React framework for building universal application. https://rax.js.org

Rax is a progressive React framework for building universal applications. ?? Write Once, Run Anywhere: write one codebase, run with Web, Weex, Node.js

Alibaba 7.8k Dec 31, 2022
✨ Create server-rendered universal JavaScript applications with no configuration

Universal JavaScript applications are tough to setup. Either you buy into a framework like Next.js or Nuxt, fork a boilerplate, or set things up yours

Jared Palmer 11k Jan 7, 2023
Universal select/multiselect/tagging component for Vue.js

vue-multiselect Probably the most complete selecting solution for Vue.js 2.0, without jQuery. Documentation Visit: vue-multiselect.js.org Sponsors Gol

Damian Dulisz 6.3k Jan 6, 2023
:bento: Full-Stack solution to quickly build PWA applications with Vue.js and Firebase

Welcome to bento-starter ?? ?? bento-starter is an Open-Source Full-Stack solution that helps you to build fast and maintainable web applications usin

Franck Abgrall 1.5k Dec 24, 2022
Universal select/multiselect/tagging component for Vue.js

vue-multiselect Probably the most complete selecting solution for Vue.js 2.0, without jQuery. Documentation Visit: vue-multiselect.js.org Sponsors Gol

Damian Dulisz 6.3k Jan 3, 2023
An upgradable boilerplate for Progressive web applications (PWA) with server side rendering, build with SEO in mind and achieving max page speed and optimized user experience.

React PWA v2 A highly scalable, Progressive Web Application foundation,boilerplate, with the best Developer Experience. Demo: https://demo.reactpwa.co

Atyantik 2.5k Dec 26, 2022
✨ Create server-rendered universal JavaScript applications with no configuration

Universal JavaScript applications are tough to setup. Either you buy into a framework like Next.js or Nuxt, fork a boilerplate, or set things up yours

Jared Palmer 11k Jan 8, 2023
Full-Stack solution to quickly build PWA applications with Vue.js and Firebase

Welcome to bento-starter ?? ?? bento-starter is an Open-Source Full-Stack solution that helps you to build fast and maintainable web applications usin

Franck Abgrall 1.5k Jan 5, 2023
🗺 Universal router for web applications.

Expressive router for nodejs and the browser. Rill brings cascading middleware to the browser and enables a familiar routing solution for web applicat

Rill 570 Dec 9, 2022
Catberry is an isomorphic framework for building universal front-end apps using components, Flux architecture and progressive rendering.

Catberry What the cat is that? Catberry was developed to help create "isomorphic/Universal" Web applications. Long story short, isomorphic/universal a

Catberry.js 801 Dec 20, 2022
A URL shortener website and PWA build with vercel serverless cloud function, MongoDB and nodeJS

❤️ lenk.cf A URL shortner made using NodeJS, MongoDB and Vercel serverless function. This project also includes a serverless API. With the help of thi

Adithya Pai B 12 Nov 5, 2022
A simple PWA to scan your EU digital COVID Certificate and generate a passbook from it

COVID-19 passbook Generator The aim of this project is to let a user scan a EU Digital COVID Certificate with their smartphone, and generate a passboo

Thibault Milan 129 Nov 11, 2022