mirror of
https://github.com/denoland/deno.git
synced 2025-02-01 12:16:11 -05:00
feat: default output filename for deno bundle (#2484)
And improve bundle docs
This commit is contained in:
parent
de8c85f8f2
commit
912e4f7177
9 changed files with 126 additions and 56 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -15,4 +15,5 @@ node_modules
|
||||||
# temp benchmark data
|
# temp benchmark data
|
||||||
/website/data.json
|
/website/data.json
|
||||||
/website/recent.json
|
/website/recent.json
|
||||||
|
/website/*.bundle.js
|
||||||
/js/gen
|
/js/gen
|
||||||
|
|
37
cli/flags.rs
37
cli/flags.rs
|
@ -186,11 +186,14 @@ compiler.",
|
||||||
.setting(AppSettings::DisableVersion)
|
.setting(AppSettings::DisableVersion)
|
||||||
.about("Bundle module and dependencies into single file")
|
.about("Bundle module and dependencies into single file")
|
||||||
.long_about(
|
.long_about(
|
||||||
"Fetch, compile, and output to a single file a module and its dependencies.
|
"Output a single JavaScript file with all dependencies
|
||||||
"
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
deno bundle https://deno.land/std/examples/colors.ts"
|
||||||
)
|
)
|
||||||
.arg(Arg::with_name("source_file").takes_value(true).required(true))
|
.arg(Arg::with_name("source_file").takes_value(true).required(true))
|
||||||
.arg(Arg::with_name("out_file").takes_value(true).required(true)),
|
.arg(Arg::with_name("out_file").takes_value(true).required(false)),
|
||||||
).subcommand(
|
).subcommand(
|
||||||
SubCommand::with_name("fetch")
|
SubCommand::with_name("fetch")
|
||||||
.setting(AppSettings::DisableVersion)
|
.setting(AppSettings::DisableVersion)
|
||||||
|
@ -498,6 +501,29 @@ pub enum DenoSubcommand {
|
||||||
Xeval,
|
Xeval,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_default_bundle_filename(source_file: &str) -> String {
|
||||||
|
use crate::worker::root_specifier_to_url;
|
||||||
|
let url = root_specifier_to_url(source_file).unwrap();
|
||||||
|
let path_segments = url.path_segments().unwrap();
|
||||||
|
let last = path_segments.last().unwrap();
|
||||||
|
String::from(last.trim_end_matches(".ts").trim_end_matches(".js"))
|
||||||
|
+ ".bundle.js"
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_default_bundle_filename() {
|
||||||
|
assert_eq!(get_default_bundle_filename("blah.ts"), "blah.bundle.js");
|
||||||
|
assert_eq!(
|
||||||
|
get_default_bundle_filename("http://example.com/blah.ts"),
|
||||||
|
"blah.bundle.js"
|
||||||
|
);
|
||||||
|
assert_eq!(get_default_bundle_filename("blah.js"), "blah.bundle.js");
|
||||||
|
assert_eq!(
|
||||||
|
get_default_bundle_filename("http://example.com/blah.js"),
|
||||||
|
"blah.bundle.js"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn flags_from_vec(
|
pub fn flags_from_vec(
|
||||||
args: Vec<String>,
|
args: Vec<String>,
|
||||||
) -> (DenoFlags, DenoSubcommand, Vec<String>) {
|
) -> (DenoFlags, DenoSubcommand, Vec<String>) {
|
||||||
|
@ -510,7 +536,10 @@ pub fn flags_from_vec(
|
||||||
("bundle", Some(bundle_match)) => {
|
("bundle", Some(bundle_match)) => {
|
||||||
flags.allow_write = true;
|
flags.allow_write = true;
|
||||||
let source_file: &str = bundle_match.value_of("source_file").unwrap();
|
let source_file: &str = bundle_match.value_of("source_file").unwrap();
|
||||||
let out_file: &str = bundle_match.value_of("out_file").unwrap();
|
let out_file = bundle_match
|
||||||
|
.value_of("out_file")
|
||||||
|
.map(String::from)
|
||||||
|
.unwrap_or_else(|| get_default_bundle_filename(source_file));
|
||||||
argv.extend(vec![source_file.to_string(), out_file.to_string()]);
|
argv.extend(vec![source_file.to_string(), out_file.to_string()]);
|
||||||
DenoSubcommand::Bundle
|
DenoSubcommand::Bundle
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ import "./performance_test.ts";
|
||||||
import "./permissions_test.ts";
|
import "./permissions_test.ts";
|
||||||
import "./version_test.ts";
|
import "./version_test.ts";
|
||||||
|
|
||||||
import "../website/app_test.js";
|
import "../website/app_test.ts";
|
||||||
|
|
||||||
import { runIfMain } from "./deps/https/deno.land/std/testing/mod.ts";
|
import { runIfMain } from "./deps/https/deno.land/std/testing/mod.ts";
|
||||||
|
|
||||||
|
|
8
tools/build_website.py
Executable file
8
tools/build_website.py
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
import os
|
||||||
|
from util import run, root_path, build_path
|
||||||
|
|
||||||
|
os.chdir(os.path.join(root_path, "website"))
|
||||||
|
deno_exe = os.path.join(build_path(), "deno")
|
||||||
|
run([deno_exe, "bundle", "app.ts", "app.bundle.js"])
|
|
@ -1,14 +1,18 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
# Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
from util import run, root_path
|
from util import run, root_path, build_path
|
||||||
|
|
||||||
# Probably run tools/docs.py first.
|
# Probably run tools/docs.py first.
|
||||||
# AWS CLI must be installed separately.
|
# AWS CLI must be installed separately.
|
||||||
|
|
||||||
os.chdir(os.path.join(root_path, "website"))
|
os.chdir(os.path.join(root_path, "website"))
|
||||||
|
|
||||||
|
deno_exe = os.path.join(build_path(), "deno")
|
||||||
|
run([sys.executable, "../tools/build_website.py"])
|
||||||
|
|
||||||
# Invalidate the cache.
|
# Invalidate the cache.
|
||||||
run([
|
run([
|
||||||
"aws", "cloudfront", "create-invalidation", "--distribution-id",
|
"aws", "cloudfront", "create-invalidation", "--distribution-id",
|
||||||
|
|
|
@ -139,7 +139,8 @@ function generate(
|
||||||
const yAxis = {
|
const yAxis = {
|
||||||
padding: { bottom: 0 },
|
padding: { bottom: 0 },
|
||||||
min: 0,
|
min: 0,
|
||||||
label: yLabel
|
label: yLabel,
|
||||||
|
tick: null
|
||||||
};
|
};
|
||||||
if (yTickFormat) {
|
if (yTickFormat) {
|
||||||
yAxis.tick = {
|
yAxis.tick = {
|
||||||
|
@ -272,3 +273,27 @@ export async function drawChartsFromBenchmarkData(dataUrl) {
|
||||||
gen("#thread-count-chart", threadCountColumns, "threads");
|
gen("#thread-count-chart", threadCountColumns, "threads");
|
||||||
gen("#syscall-count-chart", syscallCountColumns, "syscalls");
|
gen("#syscall-count-chart", syscallCountColumns, "syscalls");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function main(): void {
|
||||||
|
window["chartWidth"] = 800;
|
||||||
|
const overlay = window["document"].getElementById("spinner-overlay");
|
||||||
|
|
||||||
|
function showSpinner() {
|
||||||
|
overlay.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideSpinner() {
|
||||||
|
overlay.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateCharts() {
|
||||||
|
const u = window.location.hash.match("all") ? "./data.json" : "recent.json";
|
||||||
|
|
||||||
|
showSpinner();
|
||||||
|
|
||||||
|
drawCharts(u).finally(hideSpinner);
|
||||||
|
}
|
||||||
|
updateCharts();
|
||||||
|
|
||||||
|
window["onhashchange"] = updateCharts;
|
||||||
|
}
|
|
@ -1,13 +1,14 @@
|
||||||
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
import { test, testPerm, assert, assertEquals } from "../js/test_util.ts";
|
import { test, testPerm, assert, assertEquals } from "../js/test_util.ts";
|
||||||
|
import { runIfMain } from "../js/deps/https/deno.land/std/testing/mod.ts";
|
||||||
import {
|
import {
|
||||||
createBinarySizeColumns,
|
createBinarySizeColumns,
|
||||||
createExecTimeColumns,
|
createExecTimeColumns,
|
||||||
createThreadCountColumns,
|
createThreadCountColumns,
|
||||||
createSyscallCountColumns,
|
createSyscallCountColumns,
|
||||||
createSha1List
|
createSha1List
|
||||||
} from "./app.js";
|
} from "./app.ts";
|
||||||
|
|
||||||
const regularData = [
|
const regularData = [
|
||||||
{
|
{
|
||||||
|
@ -191,3 +192,5 @@ test(function createSha1ListRegularData() {
|
||||||
const sha1List = createSha1List(regularData);
|
const sha1List = createSha1List(regularData);
|
||||||
assertEquals(sha1List, ["abcdef", "012345"]);
|
assertEquals(sha1List, ["abcdef", "012345"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
runIfMain(import.meta);
|
|
@ -230,31 +230,11 @@
|
||||||
<script src="https://unpkg.com/d3@5.7.0/dist/d3.min.js"></script>
|
<script src="https://unpkg.com/d3@5.7.0/dist/d3.min.js"></script>
|
||||||
<script src="https://unpkg.com/c3@0.6.7/c3.min.js"></script>
|
<script src="https://unpkg.com/c3@0.6.7/c3.min.js"></script>
|
||||||
|
|
||||||
<script type="module">
|
<!-- Run "deno bundle app.ts" to generate app.bundle.js -->
|
||||||
import { drawCharts } from "./app.js";
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
|
||||||
window.chartWidth = 800;
|
<script src="app.bundle.js"></script>
|
||||||
const overlay = document.getElementById("spinner-overlay");
|
<script>
|
||||||
|
requirejs(['app'], (app) => app.main());
|
||||||
function showSpinner() {
|
|
||||||
overlay.style.display = "block";
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideSpinner() {
|
|
||||||
overlay.style.display = "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateCharts() {
|
|
||||||
const u = window.location.hash.match("all")
|
|
||||||
? "./data.json"
|
|
||||||
: "recent.json";
|
|
||||||
|
|
||||||
showSpinner();
|
|
||||||
|
|
||||||
drawCharts(u).finally(hideSpinner);
|
|
||||||
}
|
|
||||||
updateCharts();
|
|
||||||
|
|
||||||
window.onhashchange = updateCharts;
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -591,30 +591,9 @@ if (import.meta.main) {
|
||||||
|
|
||||||
### Flags
|
### Flags
|
||||||
|
|
||||||
```shellsession
|
Use `deno help` to see the help text.
|
||||||
deno
|
|
||||||
A secure runtime for JavaScript and TypeScript built with V8, Rust, and Tokio.
|
|
||||||
|
|
||||||
Docs: https://deno.land/manual.html
|
|
||||||
Modules: https://github.com/denoland/deno_std
|
|
||||||
Bugs: https://github.com/denoland/deno/issues
|
|
||||||
|
|
||||||
To run the REPL:
|
|
||||||
|
|
||||||
deno
|
|
||||||
|
|
||||||
To execute a sandboxed script:
|
|
||||||
|
|
||||||
deno https://deno.land/welcome.ts
|
|
||||||
|
|
||||||
To evaluate code from the command line:
|
|
||||||
|
|
||||||
deno eval "console.log(30933 + 404)"
|
|
||||||
|
|
||||||
To get help on the another subcommands (run in this case):
|
|
||||||
|
|
||||||
deno help run
|
|
||||||
|
|
||||||
|
```
|
||||||
USAGE:
|
USAGE:
|
||||||
deno [FLAGS] [OPTIONS] [SUBCOMMAND]
|
deno [FLAGS] [OPTIONS] [SUBCOMMAND]
|
||||||
|
|
||||||
|
@ -640,6 +619,7 @@ OPTIONS:
|
||||||
|
|
||||||
SUBCOMMANDS:
|
SUBCOMMANDS:
|
||||||
<script> Script to run
|
<script> Script to run
|
||||||
|
bundle Bundle module and dependnecies into single file
|
||||||
eval Eval script
|
eval Eval script
|
||||||
fetch Fetch the dependencies
|
fetch Fetch the dependencies
|
||||||
fmt Format files
|
fmt Format files
|
||||||
|
@ -678,6 +658,46 @@ Particularly useful ones:
|
||||||
--async-stack-trace
|
--async-stack-trace
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Bundling
|
||||||
|
|
||||||
|
`deno bundle [URL]` will output a single JavaScript file, using
|
||||||
|
[AMD](https://en.wikipedia.org/wiki/Asynchronous_module_definition), which
|
||||||
|
includes all dependencies of the specified input.
|
||||||
|
|
||||||
|
```
|
||||||
|
> deno bundle https://deno.land/std/examples/colors.ts
|
||||||
|
Bundling "colors.bundle.js"
|
||||||
|
Emitting bundle to "colors.bundle.js"
|
||||||
|
9.2 kB emitted.
|
||||||
|
```
|
||||||
|
|
||||||
|
To run then bundle in Deno use
|
||||||
|
|
||||||
|
```
|
||||||
|
deno https://deno.land/std/bundle/run.ts colors.bundle.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Bundles can also be loaded in the web browser with the assistance of
|
||||||
|
[RequireJS](https://requirejs.org/). Suppose we have a bundle called
|
||||||
|
`website.bundle.js`, then the following HTML should be able to load it:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
|
||||||
|
<script src="website.bundle.js"></script>
|
||||||
|
<script>
|
||||||
|
requirejs(["website"], website => website.main());
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
Here we assume there's an exported function `main()` from `website.ts`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// website.ts
|
||||||
|
export main() {
|
||||||
|
console.log("hello from the web browser");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Import maps
|
## Import maps
|
||||||
|
|
||||||
Deno supports [import maps](https://github.com/WICG/import-maps).
|
Deno supports [import maps](https://github.com/WICG/import-maps).
|
||||||
|
|
Loading…
Add table
Reference in a new issue