Bundler
A bundler that transpiles and bundles deno code for the web.
Why Use Bundler
- no configuration setup
- handles relative, absolute and url imports with and without file extension
- handles dynamic imports
- smart splits dependencies
--optimize
option minifiesjavascript
andcss
files--watch
option observes all dependencies and re-bundles on files changes- handles
typescript
andjavascript
files - handles
html
files andsrc
andhref
imports - handles
css
files andcss
@import
statements - supports
css
postcss-preset-env stage 2 and nesting-rules by default - handles
json
andwebmanifest
files - handles
image
files
deno bundle
…
But there is Deno offers deno bundle
to transpile a file to a standalone module. This might work in some occations but is limited.
Bundler works in a similar way to deno bundle
but is created with the web in mind.
Key differences
- Bundler supports
css
,html
,json
,webmanifest
andimage
files - Bundler splits dynamic imports into separate files and injects paths. It splits code that is imported in multiple files so it is only loaded once.
- The
--optimize
option allows for code minification. - The
--watch
option observes all dependencies and re-bundles on files changes.
CLI
Installation
Bundler is available as a CLI.
deno install --unstable --allow-read --allow-write --allow-net --allow-env --name bundler https://deno.land/x/bundler/cli.ts
Info: You might need to specify --root /usr/local
.
Usage
bundler bundle index.ts=index.js
Options
Option | Description | Default |
---|---|---|
-c, –config <FILE> | Load tsconfig.json configuration file | {} |
–out-dir <DIR> | Name of out_dir | “dist” |
-h, –help | Prints help information | |
–import-map <FILE> | UNSTABLE: Load import map file | {} |
–optimize | Optimize source code | false |
-L, –log-level | Set log level [possible values: debug, info] | debug |
-q, –quiet | Suppress diagnostic output | false |
-r, –reload | Reload source code | false |
–watch | Watch files and re-bundle on change | false |
Smart splitting
Bundler automatically analyzes the dependency graph and splits dependencies into a separate files, if the code is used in different entry points. This allows bundle files to share code.
Plugins
TypescriptPlugin
Bundler uses TypescriptPlugin by default.
It handles .ts
, .tsx
, .js
and .jsx
files. This plugin handles modules relative and absolute paths with and without extensions as well as urls.
JsonPlugin
Bundler uses JsonPlugin by default.
It handles .json
files. This plugin will convert the file into a javascript module with a default string export.
/* src/data.json */
{
"foo": "bar"
}
/* src/index.ts */
import data from "./data.json"
console.log(data) // { "foo": "bar" }
Info JSON modules is currently at stage 2. This plugin might change or even will become obsolete once the next stage is reached.
CssPlugin
Bundler uses CssPlugin by default.
It handles .css
files. This plugin will convert the file into a javascript module with a default string export.
CSS is native to browsers and bundler therefore focuses on making css usage really easy.
It supports postcss-preset-env with stage 2 features and nesting-rules enabled so you can use the latest css features out of the box.
/* src/styles.css */
article {
& > p {
color: red;
}
}
/* src/index.ts */
import styles from "./styles.css"
console.log(styles) // article > p { color: red; }
HtmlPlugin
Bundler uses HtmlPlugin by default.
It handles .html
files.
WebmanifestPlugin
Bundler uses WebmanifestPlugin by default. It handles webmanifest files that are loaded in a html file. This plugin handles the icons that are declared in the manifest file.
// src/manifest.json
{
"name": "My App",
"short_name": "App",
"icons": [
{
"src": "images/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "images/icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
}
],
"start_url": "/",
"background_color": "#000000",
"display": "standalone",
"theme_color": "#ffffff"
}
<!-- src/index.html -->
<html>
<head>
<link rel="manifest" href="manifest.json">
</head>
<body>
</body>
</html>
ImagePlugin
Bundler uses ImagePlugin by default.
It handles .png
, .jpg
, .jpeg
and .ico
files.
SvgPlugin
Bundler uses SvgPlugin by default.
It handles .svg
files.
Examples
Hello world
Components
Other
Unstable
This module requires deno to run with the --unstable
flag. Itis likely to change in the future.