0.2.0 • Published 4 years ago

@mizchi/bundler v0.2.0

Weekly downloads
-
License
MIT
Repository
-
Last release
4 years ago

@mizchi/bundler

My hobby bundler like webpack/rollup. Do not use production.

Features

  • Run universal
  • Modern JS(ES2019) Target
  • only handle ESM
  • readable output(but loose)
  • treeshake

Example

import { Bundler } from "@mizchi/bundler";
import { format } from "prettier"; // install yourself
const fileMap = {
  "/foo.js": "export default 1;",
  "/index.js": `import foo from "./foo.js"; console.log(foo); export const index = 1;`,
};
const bundler = new Bundler(fileMap);
(async () => {
  const code = await bundler.bundle("/index.js", { optimize: true });
  console.log(format(code, { parser: "babel" }));
})();

output

// @mizchi/bundler generate
const _$_exported = {};
const _$_import = (id) =>
  _$_exported[id] || _$_modules[id]((_$_exported[id] = {}));
const _$_modules = {
  "/foo.js": (_$_exports) => {
    _$_exports.default = 1;
    return _$_exports;
  },
};
// -- entry --

const { default: foo } = _$_import("/foo.js");

console.log(foo);
export const index = 1;

Entry exports are left.

Example: chunks

WIP

Example: Worker

WIP

TODO

  • Delete build cache and rebuild
  • import "./xxx";
  • export const a = 1;
  • Tree shaking
    • Detect side effects
    • Strip unused import
    • Remove modules code by treeshake
    • Remove unused exports
  • Dynamic import chunks: bundler.bundleChunks(entry)
  • publicPath
  • Bundle for worker
  • export { a }
  • export { a } from "./b"
  • export { a as x} from "./b"
  • Entry: export {...};
  • Module: export * as x from ...
  • Entry: export {...} from ...

Dynamic library features

  • Skip import and export those are not relative
  • Support import-map
  • Use with snowpack
  • name resolver on preservedExternalImports and Worker
  • Rewrite to pikacdn options
  • File watcher with node
  • Support tsx
  • Node fs/promises

Icebox

  • Inline Worker
  • minilink integration
  • compile to single html

LICENSE

MIT