#assets #web #web-apps #web-framework #management #wrapper #webpack

webpacker

Rust 语言的 Webpacker 包装库,用于管理资产

11个版本

使用旧的 Rust 2015

0.3.4 2021年1月18日
0.3.3 2018年11月22日
0.2.0 2018年11月16日
0.1.4 2018年11月16日

#2385 in 网页编程

每月32次下载

LGPL-3.0

9KB
107

Webpacker-rs

Webpacker-rs 是一个 Rust 包装库,用于在 Rust 网页框架的部署和资产管理中使用 WebpackerCli/Webpacker/Webpack。

用法

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
webpacker = "~0.3"

[build-dependencies]
webpacker = "~0.3"

在您能够构建之前,您需要使用以下命令初始化 webpacker 环境

gem install webpacker_cli
webpacker-cli init

现在您的构建脚本将能够编译。在您的构建脚本中,您可以进行以下操作

use webpacker;
fn main() {
    // Validating dependencies…
    assert!(webpacker::valid_project_dir());

    // Compiling assets…
    let _ = webpacker::compile();
}

然后在您的应用程序在网页启动期间,您可以使用以下命令生成文件清单的哈希值

use webpacker;

// Returns `Manifest` object which is an
// immutable Hashmap
webpacker::manifest()

您可以在您的路由表中使用 Manifest 对象。

Gotham

Gotham 中,您可以使用以下方式将清单用于路由器

pub fn router() -> Router {
    build_simple_router(|route| {
        for (key, value) in webpacker::manifest(None).unwrap() {
            route
                .get(&format!("public/{}", key))
                .to_file(format!("public{}", value));
        }
    })
}

在您的每个网页中,您可以将资产链接到您的网页,就像它们位于 public/ 文件夹中一样。这将把正常的文件名如 application.js 映射到其哈希版本 /packs/application-285f2db5acb1800187f0.js我不确定路由器这样做是否能让缓存失效工作如预期。

推荐的做法是将映射的文件名直接写入生成的网页HTML源。如果您使用 tera,则可以这样做

pub static ASSET_DIRECTORY: &'static str = "public";

lazy_static! {
    pub static ref MANIFEST: Manifest = webpacker::manifest(None).unwrap();
}

mod assets {
    use super::{ASSET_DIRECTORY, MANIFEST};
    use webpacker::asset_path::AssetPath;
    use std::ops::Deref;

    pub fn source(key: &str) -> String {
        AssetPath::new(ASSET_DIRECTORY, key, MANIFEST.deref()).into()
    }
}

pub fn index_page(state: State) -> (State, (mime::Mime, String)) {
    let mut context = Context::new();
    context.insert("application_source", &assets::source("application.js"));

    let rendered = TERA.render("landing_page/index.html.tera", &context).unwrap();

    (state, (mime::TEXT_HTML, rendered))
}
<script src="{{ application_source }}"></script>

使用这种方式,您应该使用类似以下方式将文件夹 /public/* 路由

pub fn router() -> Router {
    build_simple_router(|route| {
        route.get("public/*").to_dir(
            FileOptions::new("public")
                .with_cache_control("no-cache")
                .with_gzip(true)
                .build(),
        );
    })  
}

FileOptions 这里提供异步文件支持。

贡献

欢迎在 GitHub 上提交错误报告和拉取请求:https://github.com/danielpclark/webpacker-cli

许可证

该软件库以开源形式提供,遵循 GNU Lesser General Public License version 3 的条款。

依赖项

~1MB
~25K SLoC