#web-apps #web #cargo #cargo-build #cargo-subcommand #asmjs #wasm-build

bin+lib cargo-web

A Cargo 子命令,用于客户端 Web

47 个版本

使用旧的 Rust 2015

0.6.26 2019年7月15日
0.6.24 2019年4月14日
0.6.23 2018年12月15日
0.6.21 2018年11月22日
0.1.1 2017年3月8日

Cargo 插件 中排名第 228

Download history 60/week @ 2024-03-11 59/week @ 2024-03-18 47/week @ 2024-03-25 84/week @ 2024-04-01 53/week @ 2024-04-08 54/week @ 2024-04-15 40/week @ 2024-04-22 45/week @ 2024-04-29 65/week @ 2024-05-06 85/week @ 2024-05-13 38/week @ 2024-05-20 53/week @ 2024-05-27 52/week @ 2024-06-03 40/week @ 2024-06-10 29/week @ 2024-06-17 31/week @ 2024-06-24

每月下载量 156
2 个crate 使用

MIT/Apache

335KB
8K SLoC

Build Status

A cargo 子命令,用于客户端 Web

此 cargo 子命令旨在使使用 Rust 编写的客户端 Web 应用程序的构建、开发和部署变得简单方便。

捐赠

Become a patron

赞助者

这些美好的人们使这款软件得以问世

  • Embark Studios
  • Joe Narvaez
  • Eduard Knyshov
  • Anselm Eickhoff
  • Johan Andersson
  • Stephen Sugden
  • is8ac

感谢您!

功能

目前它支持以下功能

  • cargo web build - 使用 Rust 的三个 Web 后端之一构建您的项目
    • WebAssembly 使用 Rust 的原生 WebAssembly 后端(当传递 --target=wasm32-unknown-unknown;默认值)
    • WebAssembly 使用 Emscripten(当传递 --target=wasm32-unknown-emscripten
    • asm.js 使用 Emscripten(当传递 --target=asmjs-unknown-emscripten
  • cargo web check - 将对您的项目进行类型检查
  • cargo web test - 将在以下环境中运行您的测试
    • 在无头 Google Chrome 实例下(默认)
    • Node.js 下(当传递 --nodejs
  • cargo web start - 将构建您的项目,启动嵌入式Web服务器,并在必要时持续重新构建;支持使用--auto-reload进行自动重新加载。
  • cargo web deploy - 将构建您的项目并输出所有必要的文件,以便您可以轻松地以静态方式提供它们。
  • 将在以下平台上自动下载和安装Emscripten(如果需要):
    • Linux x86-64
    • Linux x86
  • 将通过rustup自动为您安装相关的Rust目标。

如果您想在项目中与JavaScript世界交互,强烈建议您查看stdweb crate。(实际上,是cargo-web使得在Rust的原生WebAssembly后端上使用stdwebjs!宏成为可能。)

安装

$ cargo install cargo-web

要升级

$ cargo install --force cargo-web

或者使用$ cargo build --release进行克隆和构建,然后将其放置在您的$PATH中。

在Linux上,安装可能会失败,显示找不到OpenSSL的错误消息,在这种情况下,您可能需要从您的发行版的存储库中安装OpenSSL的-dev包。(在Ubuntu上称为libssl-dev。)

Web.toml

cargo-web有自己的配置文件,您可以将其放在cargoCargo.toml旁边。

以下是一个配置示例,展示了所有支持的关键字

# The default value of `--target` used when building this crate
# in cases where it's not specified on the command line.
default-target = "wasm32-unknown-unknown"

# This will prepend a given JavaScript file to the resulting `.js` artifact.
# You can put any initialization code here which you'd like to have executed
# when your `.js` file first loads.
#
# This accepts either a string (as shown here), or an array of strings,
# in which case it will prepend all of the specified files in their
# order of appearance.
prepend-js = "src/runtime.js"

[cargo-web]
# Asserts the minimum required version of `cargo-web` necessary
# to compile this crate; supported since 0.6.0.
minimum-version = "0.6.0"

# These will only take effect on *-emscripten targets.
[target.emscripten]
# You can have a target-specific `prepend-js` key.
prepend-js = "src/emscripten_runtime.js"
# This will enable Emscripten's SDL2 port. Consult Emscripten's documentation
# for more details.
link-args = ["-s", "USE_SDL=2"]

# You can also specify the target by its full name.
[target.wasm32-unknown-unknown]
prepend-js = "src/native_runtime.js"

如果您使用任何具有Web.toml的外部crate,则cargo-web会加载并使用它。

关于Web.toml的一些限制

  • 您不能有重叠的prepend-js密钥。您可以定义单个全局prepend-js,或者为每个目标定义多个。
  • 当前的link-args中不能包含任何空格。
  • cargo-web处理来自多个crate的Web.toml文件的顺序是确定性的但未指定。这意味着您不应该以任何方式依赖于此顺序。

静态文件

您想在运行cargo web start或部署时运行cargo web deploy时要提供的任何静态文件都可以放在crate根目录下的static目录中。默认情况下不需要静态工件;如果缺少,将自动为您生成一个index.html文件。当然,您也可以放置自己的static/index.html文件,在这种情况下,将使用它而不是自动生成的文件。

在编译期间检测cargo-web

如果在编译期间您想检测您的项目是用cargo-web构建的,您可以通过检查COMPILING_UNDER_CARGO_WEB环境变量来做到这一点,该变量将被设置为1

在Travis上使用 cargo-web

预编译的二进制文件

您可以使用以下脚本下载并安装最新的 cargo-web

CARGO_WEB_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/koute/cargo-web/releases/latest)
CARGO_WEB_VERSION=$(echo $CARGO_WEB_RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
if [ "$(uname -s)" == "Darwin" ]; then
  CARGO_WEB_HOST_TRIPLE="x86_64-apple-darwin"
else
  CARGO_WEB_HOST_TRIPLE="x86_64-unknown-linux-gnu"
fi
CARGO_WEB_URL="https://github.com/koute/cargo-web/releases/download/$CARGO_WEB_VERSION/cargo-web-$CARGO_WEB_HOST_TRIPLE.gz"


echo "Downloading cargo-web from: $CARGO_WEB_URL"
curl -L $CARGO_WEB_URL | gzip -d > cargo-web
chmod +x cargo-web

mkdir -p ~/.cargo/bin
mv cargo-web ~/.cargo/bin

在无头Chrome下运行测试

默认情况下,cargo web test 将在无头Chrome下运行您的测试。要在Travis上使用此功能,您需要将以下内容添加到您的 .travis.yml

addons:
  chrome: stable

自定义运行时(仅限 wasm32-unknown-unknown

默认情况下,cargo-web 为您生成一个独立的运行时。这意味着生成的 .js 文件可以直接放入 <script> 标签中,或使用Node.js启动,无需手动加载或执行任何额外操作,但这确实限制了您的可定制性。

如果您想对模块的加载方式有更多控制,可以使用 --runtime library-es6 选项告诉 cargo-web 为您生成一个非独立、类似库的模块。这将生成一个 .js 文件,该文件导出一个具有以下接口的工厂函数

export default function() {
    return {
        imports: { ... },
        initialize: function( instance ) { ... }
    };
}

在这里,您需要自行实例化WebAssembly模块;在这种情况下,您需要传递 imports 作为其导入,然后立即在实例化后调用 initialize

例如,假设您将 cargo-web 生成的模块命名为 my-module.mjsmy-module.wasm,您可以从Node.js像这样实例化它

import fs from "fs";
import factory from "my-module.mjs";

// We read in the `.wasm` module.
const bytecode = fs.readFileSync( "my-module.wasm" );
const wasm = new WebAssembly.Module( bytecode );

// We instantiate it.
const instance = factory();
const compiled = new WebAssembly.Instance( wasm, instance.imports );

// This will initialize the module and call your `main`, if you have one.
const exports = instance.initialize( compiled );

// In the object it returns you can find any functions which
// you've exported with `stdweb`'s `#[js_export]` macro.
console.log( exports.add( 1, 2 ) );

然后您可以使用 node --experimental-modules run.mjs 运行它。

如果您想从自定义URL加载您的 .wasm 文件,或者您想将输出与JavaScript打包器集成,或者任何需要您自行加载模块的其他情况,这很有用。

变更日志

  • 0.6.26
    • 已修复 --no-default-features 标志
    • 嵌入式Web服务器现在使用 mime-guess 包来猜测MIME类型
  • 0.6.25
    • cargo web start 现在将尝试在项目文件连续修改时避免触发不必要的重建
    • 已更新到最新版本的嵌入式OpenSSL副本
  • 0.6.24
    • 现在正确支持形式为 [target.'cfg(...)'.dependencies] 的条件依赖
    • 现在您可以使用 cfg(cargo_web) 来检测您的crate是否正在 cargo-web 下编译
    • 现在忽略与 target/wasm32-unknown-unknown/*/deps/*.wasm 匹配的工件;这应该可以防止 cargo-web 处理由于依赖项也是 cdylib 而产生的多余 .wasm 工件
    • cargo-web 现在可以通过基于 structopt 的接口作为库使用
  • 0.6.23
    • 新增子命令:cargo web check
    • wasm32-unknown-unknown 现在是默认目标
  • 0.6.22
    • 在 macOS 上通过 Chrome 运行测试现在应该能够直接工作
    • deploy 子命令现在可以使用 -o/--output 参数指定部署位置
    • 现在可以正确地提供名称中包含空格的静态文件
    • Access-Control-Allow-Origin: * 现在总是由嵌入式网络服务器发送
    • 如果使用了足够新的 stdweb,现在支持在 wasm32-unknown-unknown 上进行调试构建
  • 0.6.21
    • Emscripten 已更新到 1.38.19;基于 Emscripten 的目标现在应该可以在夜间版本上再次工作
    • 测试运行器中的输出重定向问题现在已修复
    • 现在对 wasm32-unknown-unknown 下的生成的 JS 片段和导入进行了排序
    • 删除了对 wasm32-unknown-unknown 的非常旧的夜间版本的兼容性
  • 0.6.20
    • 通过 cargo install 的安装现在应该可以再次工作
    • 大多数依赖项都已更新到新版本
    • deploy 在找不到有效目标时现在不会恐慌
  • 0.6.19
    • cargo install 现在应该可以在某些环境中编译而不是失败
    • 最低要求的 Rust 版本是现在 1.26.2
  • 0.6.18
    • 默认的 index.html 现在在其 doctype 前不再有换行符了
  • 0.6.17
    • 现在以供应商的形式提供了 OpenSSL;这应该可以解决某些环境中的编译问题
    • 最低要求的 Rust 版本是现在 1.25.0
  • 0.6.16
    • 现在当可用时,wasm32-unknown-unknown 的运行时使用 WebAssembly.instantiateStreaming
    • 现在支持在无头 Chromium 下为 wasm32-unknown-unknown 目标运行测试
    • cargo-web 的输出被重定向时不再发出颜色代码
    • 改进了着色;现在应该有更多消息被着色
    • 最初实验性地支持异步测试

许可证

许可为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,都将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~28–41MB
~738K SLoC