pyssgA tiny-kernel, plugin-driven static site generator

Vòng đời

Một lần build chạy như một chuỗi pass theo từng giai đoạn: mỗi pass quét toàn bộ tập source trước khi pass kế tiếp bắt đầu. Điều này phản chiếu cách webpack build mọi module trước khi "seal", và chính nó cho phép một plugin nhìn thấy toàn bộ trang - thiết yếu cho navigation, collection và các trang dẫn xuất.

initialize                       (after every plugin is applied)
before_run
  discover                       (collect Sources)
  load       (each source)       (read raw content)        [bail]
  parse      (each source)       (split frontmatter/body)
  collect    (whole build)       (build site-wide context -> build.meta)
  transform  (each source)       (body -> content)         [waterfall]
  render     (each source)       (emit Output; sees whole site)
  generate   (whole build)       (derived pages: rss, extra files)
  optimize   (whole build)       (minify, optimize)        [stage ordering]
  emit       (whole build)       (write to disk)
  after_emit (whole build)       (sitemap, graph, report)
done | failed

Vì sao theo giai đoạn, không theo từng source

Nếu mỗi source được xử lý trọn vẹn một cách biệt lập, một trang sẽ không thể biết về các trang khác khi đang render - khiến navigation, "bài viết liên quan" hay chỉ mục tag trở nên bất khả thi. Bằng cách hoàn tất parse cho tất cả source trước khi collect chạy, plugin có thể dựng nên bức tranh đầy đủ về trang trước.

Hai điểm mở rộng cho công việc toàn-trang

  • collect chạy trước render. Chỉ đọc đối với output: nó tập hợp ngữ cảnh toàn-trang vào build.meta (collection, navigation) để mọi trang dùng được. Các plugin tier-2 tạo ra trang nhân tạo (như listing) cũng nối thêm Source của chúng tại đây, để các trang đó chảy tự nhiên qua transformrender.
  • generate chạy sau render. Nó tổng hợp trực tiếp các file Output - những thứ không bao giờ đi qua template, như sitemap.xml hay một RSS feed.

build.meta

build.meta là một túi ngữ cảnh dùng chung (một dict). Pass collect ghi vào nó; render, generate và template đọc từ nó. Các plugin tier-2 thống nhất một tập khóa nhỏ - site, collections, menus - và chính điều đó giữ cho hệ sinh thái không bị phân mảnh.

Xem Hook để biết thứ tự bên trong một pass hoạt động ra sao.