@endiliey/static-site-generator-webpack-plugin

中文文档
4.0.0发布于 2019/10/27MITCommonJS近 30 天下载 1.6万

Minimal, unopinionated static site generator powered by webpack

原始使用文档
文档目录14 节
  1. Install
  2. Usage
  3. webpack.config.js
  4. index.js
  5. Multi rendering
  6. Default locals
  7. Crawl mode
  8. Custom file names
  9. Globals
  10. Asset support
  11. Specifying entry
  12. Compression support
  13. Related projects
  14. License

Build Status Coverage Status Dependency Status npm

static site generator webpack plugin

Minimal, unopinionated static site generator powered by webpack.

Bring the world of server rendering to your static build process. Either provide an array of paths to be rendered, or crawl your site automatically, and a matching set of index.html files will be rendered in your output directory by executing your own custom, webpack-compiled render function.

This plugin works particularly well with universal libraries like React and React Router since it allows you to pre-render your routes at build time, rather than requiring a Node server in production.

Install

$ npm install --save-dev static-site-generator-webpack-plugin

Usage

Ensure you have webpack installed, e.g. npm install -g webpack

webpack.config.js

const StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin');

module.exports = {

  entry: './index.js',

  output: {
    filename: 'index.js',
    path: 'dist',
    /* IMPORTANT!
     * You must compile to UMD or CommonJS
     * so it can be required in a Node context: */
    libraryTarget: 'umd'
  },

  plugins: [
    new StaticSiteGeneratorPlugin({
      paths: [
        '/hello/',
        '/world/'
      ],
      locals: {
        // Properties here are merged into `locals`
        // passed to the exported render function
        greet: 'Hello'
      }
    })
  ]

};

index.js

Sync rendering:

module.exports = function render(locals) {
  return '<html>' + locals.greet + ' from ' + locals.path + '</html>';
};

Async rendering via callbacks:

module.exports = function render(locals, callback) {
  callback(null, '<html>' + locals.greet + ' from ' + locals.path + '</html>');
};

Async rendering via promises:

module.exports = function render(locals) {
  return Promise.resolve('<html>' + locals.greet + ' from ' + locals.path + '</html>');
};

Multi rendering

If you need to generate multiple files per render, or you need to alter the path, you can return an object instead of a string, where each key is the path, and the value is the file contents:

module.exports = function render() {
  return {
    '/': '<html>Home</html>',
    '/hello': '<html>Hello</html>',
    '/world': '<html>World</html>'
  };
};

Note that this will still be executed for each entry in your paths array in your plugin config.

Default locals

// The path currently being rendered:
locals.path;

// An object containing all assets:
locals.assets;

// Advanced: Webpack's stats object:
locals.webpackStats;

Any additional locals provided in your config are also available.

Crawl mode

Rather than manually providing a list of paths, you can use the crawl option to automatically crawl your site. This will follow all relative links and iframes, executing your render function for each:

module.exports = {

  ...

  plugins: [
    new StaticSiteGeneratorPlugin({
      crawl: true
    })
  ]
};

Note that this can be used in conjunction with the paths option to allow multiple crawler entry points:

module.exports = {

  ...

  plugins: [
    new StaticSiteGeneratorPlugin({
      crawl: true,
      paths: [
        '/',
        '/uncrawlable-page/'
      ]
    })
  ]
};

Custom file names

By providing paths that end in .html, you can generate custom file names other than the default index.html. Please note that this may break compatibility with your router, if you're using one.

module.exports = {

  ...

  plugins: [
    new StaticSiteGeneratorPlugin({
      paths: [
        '/index.html',
        '/news.html',
        '/about.html'
      ]
    })
  ]
};

Globals

If required, you can provide an object that will exist in the global scope when executing your render function. This is particularly useful if certain libraries or tooling you're using assumes a browser environment.

For example, when using Webpack's require.ensure, which assumes that window exists:

module.exports = {
  ...,
  plugins: [
    new StaticSiteGeneratorPlugin({
      globals: {
        window: {}
      }
    })
  ]
}

Asset support

template.ejs

<% css.forEach(function(file){ %>
<link href="<%- file %>" rel="stylesheet">
<% }); %>

<% js.forEach(function(file){ %>
<script src="<%- file %>" async></script>
<% }); %>

index.js

if (typeof global.document !== 'undefined') {
  const rootEl = global.document.getElementById('outlay');
  React.render(
    <App />,
    rootEl,
  );
}

export default (data) => {
  const assets = Object.keys(data.webpackStats.compilation.assets);
  const css = assets.filter(value => value.match(/\.css$/));
  const js = assets.filter(value => value.match(/\.js$/));
  return template({ css, js, ...data});
}

Specifying entry

This plugin defaults to the first chunk found. While this should work in most cases, you can specify the entry name if needed:

module.exports = {
  ...,
  plugins: [
    new StaticSiteGeneratorPlugin({
      entry: 'main'
    })
  ]
}

Compression support

Generated files can be compressed with compression-webpack-plugin, but first ensure that this plugin appears before compression-webpack-plugin in your plugins array:

const StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
  ...

  plugins: [
    new StaticSiteGeneratorPlugin(...),
    new CompressionPlugin(...)
  ]
};
  • react-router-to-array - useful for avoiding hardcoded lists of routes to render
  • gatsby - opinionated static site generator built on top of this plugin

License

MIT License

版本与发布记录

@endiliey/static-site-generator-webpack-plugin 共发布 2 个版本,首次发布于 2019/10/27;过去 12 个月发布了 0 个版本。

版本发布日期距今
4.0.0latest2019/10/277 年前
3.4.22019/10/277 年前

关于 @endiliey/static-site-generator-webpack-plugin 的常见问题

@endiliey/static-site-generator-webpack-plugin 是什么?

Minimal, unopinionated static site generator powered by webpack

如何安装 @endiliey/static-site-generator-webpack-plugin?

在项目目录运行 npm install @endiliey/static-site-generator-webpack-plugin,或使用 pnpm add / yarn add / bun add。

@endiliey/static-site-generator-webpack-plugin 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/endiliey__static-site-generator-webpack-plugin 是否存在。

@endiliey/static-site-generator-webpack-plugin 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@endiliey/static-site-generator-webpack-plugin 可以商用吗?

@endiliey/static-site-generator-webpack-plugin 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@endiliey/static-site-generator-webpack-plugin 的下载量有多少?

根据 npm 官方下载统计,@endiliey/static-site-generator-webpack-plugin 在 2026/10/14 – 2026/11/12 这 30 天内被下载 16,231 次,日均约 541 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@endiliey/static-site-generator-webpack-plugin 还在维护吗?

最新版本 4.0.0 发布于 2019/10/27(7 年前);至今共发布 2 个版本,其中过去 12 个月发布了 0 个;首次发布于 2019/10/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。