You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过shadow-cljs/inline引入文件并预先进行预处理?

解决方案

要实现编译阶段预处理嵌入文件内容的需求,你需要编写一个自定义Clojure宏(宏运行在编译期的Clojure环境中,而非运行期的ClojureScript环境),直接在宏内部完成文件读取与内容处理,最终将处理后的结果嵌入生成的代码中。

步骤1:定义自定义宏

创建一个.clj文件(比如src/app/macros.clj),编写宏逻辑:

(ns app.macros
  (:require [shadow.resource :as rc]
            [clojure.string :as str]))

;; 通用版:支持传入自定义处理函数
(defmacro inline-processed
  [file-path process-fn]
  (let [raw-content (rc/get-resource file-path)
        processed-content (eval process-fn raw-content)]
    processed-content))

;; 简化版:固定转大写处理
(defmacro inline-upper
  [file-path]
  (str/upper-case (rc/get-resource file-path)))

步骤2:在ClojureScript中使用宏

在你的ClojureScript代码里,通过:require-macros引入宏并使用:

(ns app.my
  (:require-macros [app.macros :refer [inline-processed inline-upper]])
  (:require [clojure.string :as str]))

;; 使用通用版宏,传入转大写函数
(def file-content-upper (inline-processed "file.txt" #(str/upper-case %)))

;; 使用简化版宏,直接获取大写内容
(def file-content-upper-simple (inline-upper "file.txt"))

宏展开逻辑说明

  • 宏在编译阶段执行:rc/get-resource会像rc/inline一样读取指定路径的资源文件内容;
  • 内容处理在编译期完成:无论是通用版传入的处理函数还是简化版的固定逻辑,都会直接在Clojure编译环境中执行,生成处理后的字符串字面量;
  • 最终生成的ClojureScript代码中,file-content-upper会直接是处理后的大写字符串,完全避免运行时的额外处理。

内容的提问来源于stack exchange,提问作者Eva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:52:42