
教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载导读PHP CSS Parsersabberworm/php-css-parser是 Moodle 仓库public/lib/php-css-parser目录下内置的一个纯 PHP 实现的 CSS 解析库它能把 CSS 文本解析为可编程操作的对象树Document允许开发者提取、增删改查样式规则后再重新渲染为可优化的CSS。本指南以该库的官方 README 为主体结合 Moodle 仓库内的真实源码public/lib/php-css-parser/src/与应用实例Boost 主题自动加前缀器完整讲解安装、解析选项、对象模型、增删改操作、输出格式化以及四个实战用例读完即可在 PHP 项目中独立完成读 CSS → 改 CSS → 写 CSS的全流程开发。一、库的定位与仓库内置版本该库核心能力一句话概括A Parser for CSS Files written in PHP—— 将 CSS 文件提取为数据结构的解析器允许对该结构进行修改并以优化后的CSS 形式输出。在 Moodle 仓库中它位于 public/lib/php-css-parser/目录下的 readme_moodle.txt 记录了它随 Moodle 发布的导入流程通过composer require sabberworm/php-css-parser拉取后再复制进lib/php-css-parser并额外应用了上游 PR #173 的补丁。因此仓库中的这份代码与 Composer 发布版本基本一致可放心按官方 README 的方式使用。从 composer.json 可以看到它的工程约束PHP 版本支持^5.6.20 || ^7.0.0 || ~8.0.0 ~8.4.0覆盖面很广Moodle 各版本均可运行必需扩展ext-iconv建议扩展ext-mbstringfor parsing UTF-8 CSS用于解析 UTF-8 CSS命名空间Sabberworm\CSS\通过 PSR-4 映射到src/目录许可证MIT。二、安装与快速上手Extraction2.1 Composer 安装composer require sabberworm/php-css-parser2.2 解析 CSS 文本使用解析器需要先new一个实例构造函数形式为new \Sabberworm\CSS\Parser($css);读取文件并解析的完整流程$parser new \Sabberworm\CSS\Parser(file_get_contents(somefile.css)); $cssDocument $parser-parse();从源码看Parser.php 的构造函数会以传入的文本和可选的Settings默认Settings::create()构造一个 ParserState 状态机第三个参数是起始行号默认 1而parse()方法直接委托给Document::parse($oParserState)见 Document.php最终返回一个Document对象——它就是整棵 CSS 对象树的根节点。Document内部通过CSSList::parseList逐条解析顶层内容因此能同时容纳声明块、import、charset以及各种 at-rule。解析得到的结构可被自由修改修改后再输出。三、解析选项SettingsMoodle 内置的 Settings.php 提供了三个可配置项均采用链式fluentAPI。3.1 Charset默认字符集withDefaultCharset()设置的字符集仅当 CSS 中不含charset声明时才会生效默认值就是 UTF-8源码中$sDefaultCharset utf-8。因此不改字符集时完全无需创建 Settings 对象$settings \Sabberworm\CSS\Settings::create() -withDefaultCharset(windows-1252); $parser new \Sabberworm\CSS\Parser($css, $settings);底层上ParserState.php 的构造函数会用$oParserSettings-sDefaultCharset调用setCharset()再据此对文本做字符切分解析过程中一旦遇到charset声明则会覆盖它详见 CHANGELOG 中关于 charset 的演进。3.2 严格解析Strict parsing默认情况下解析器是宽容模式bLenientParsing true遇到非法/未知结构时尝试忽略并继续解析若希望遇到非法结构直接抛出异常可配置$parser new \Sabberworm\CSS\Parser( file_get_contents(somefile.css), \Sabberworm\CSS\Settings::create()-beStrict() );注意开启严格模式还会禁用一条针对 IE 旧式filter规则非引号变体的解析兼容补丁。beStrict()的内部实现是withLenientParsing(false)见 Settings.php。宽容/严格两种行为的差异在 RuleSet.php 的parseRuleSet中有直接体现宽容模式下Rule::parse抛出的UnexpectedTokenException会被捕获解析器通过consumeUntil跳过直到换行/分号/右括号的内容来消化坏 token严格模式下则直接让异常上抛。3.3 禁用多字节函数Disable multibyte functions默认bMultibyteSupport取extension_loaded(mbstring)即系统装了 mbstring 就默认开启。可通过withMultibyteSupport(false)关闭让库改用普通字符串函数替代mb_strlen、mb_substr、mb_strpos等以获得更快的解析速度$settings \Sabberworm\CSS\Settings::create()-withMultibyteSupport(false); $parser new \Sabberworm\CSS\Parser($css, $settings);官方提醒绝大多数情况下包括 UTF-8 文件这样都能正常工作因为多字节字符基本都出现在字符串字面量里但不建议用它处理不可控的外部输入因为该路径没有被测试用例充分覆盖。3.4 三种选项速查表选项方法默认值说明默认字符集withDefaultCharset($charset)utf-8仅在没有charset声明时生效宽容解析withLenientParsing(true)/beStrict()true宽容宽容忽略非法结构继续解析严格抛异常多字节支持withMultibyteSupport(bool)取决于mbstring是否加载关闭可提速但不建议用于不可控输入四、对象模型六大核心类型解析结果主要由五种基本类型构成CSSList、RuleSet、Rule、Selector和Value另外还有两种不常用到的辅助类型Import和Charset。它们全部位于 src/ 下对应目录结构一目了然CSSList/、RuleSet/、Rule/、Property/含 Selector、Charset、Import 等、Value/。4.1 CSSListCSSList是通用 CSS 容器见 CSSList.php最典型的实现是Documentparse()的返回值一般装的是带选择器的声明块但也可能包含 at-rules、charset声明等。其子类包括CSSBlockList带块的列表基类见 CSSBlockList.phpDocument文档根节点见 Document.phpKeyFramekeyframes专用列表见 KeyFrame.phpAtRuleBlockListmedia等带块 at-rule 列表见 AtRuleBlockList.php。访问CSSList中的条目比如$parser-parse()返回的文档使用getContents()然后遍历集合并用instanceof判断条目是另一个CSSList、RuleSet、Import还是Charset。要向既有CSSList追加新条目如选择器、媒体查询等用对应类的构造函数创建对象后调用append($oItem)方法。4.2 RuleSetRuleSet见 RuleSet.php是单条规则的容器最常见的形态是被选择器约束的规则集。两个具体子类AtRuleSet见 AtRuleSet.php—— 通用 at-rule 规则集专门覆盖未被import、charset、media等专门类处理的 at-rule典型例子就是font-faceDeclarationBlock见 DeclarationBlock.php—— 被Selector约束的RuleSet内部持有选择器对象数组对应 CSS 中的逗号分隔选择器列表以及应用到匹配元素上的规则。嵌套规则CSSList可以包含其它CSSList以及Import、Charset而RuleSet只能包含Rule。操作RuleSet使用三个方法addRule(Rule $rule)、getRules()和removeRule($rule)。其中removeRule()的参数可以是Rule对象也可以是规则名规则名后追加一个短横线即可删除所有相关规则例如font-会同时删掉font-size、font-weight以及font本身。4.3 RuleRule见 Rule.php只有两个核心成员字符串键规则名和对应的Value同时它内部还有bIsImportant布尔标记用来记录!important示例 2 的 var_dump 中color: red !important即表现为bIsImportant bool(true)。4.4 Value 及其子类Value见 Value.php是抽象基类只定义了render方法。原子值类型的具体子类Size见 Size.php—— 由一个数值size和一个单位组成如1.6em、0px、2%Color见 Color.php—— 颜色可用#rrggbb、#rgb或schema(val1, val2, …)形式输入但内部一律存储为(s val1, c val2, h val3, …)这种数组结构并以第二种形式输出CSSString见 CSSString.php—— 带引号字符串的包装器用于与关键字区分输出时一律使用双引号URL见 URL.php—— CSS 中的 URL输出时一律使用URL()记号如示例 1 中src: url(../media/cr.ttf)。Value下还有另一个抽象子类ValueList见 ValueList.php表示由某种分隔符多数是,、空格或/分隔的Value列表。ValueList又分两种RuleValueList见 RuleValueList.php—— 默认类型表示所有多值规则例如font: bold 12px/3 Helvetica, Verdana, sans-serif;的值就是一个空白分隔列表其中bold是原始值、12px/3是斜杠分隔列表、Helvetica, Verdana, sans-serif是逗号分隔列表CSSFunction见 CSSFunction.php—— 特殊的值类型含函数名其值即函数参数同时支持等号分隔的参数列表如filter: alpha(opacity90);。仓库还提供了CalcFunctioncalc()计算函数见 CalcFunction.php、CalcRuleValueList见 CalcRuleValueList.php、PrimitiveValue见 PrimitiveValue.php等扩展类型可见其对现代 CSS 语法calc()、grid 的LineName等也有专门支持。4.5 Document 的便捷方法Convenience methodsDocument上提供了一批便于查找、修改、删除规则的便捷方法见 Document.phpgetAllDeclarationBlocks()—— 递归返回全部DeclarationBlock无论选择器嵌套多深别名getAllSelectors()后者已标记 deprecated将在 9.0 移除建议使用前者getAllRuleSets()—— 递归返回全部RuleSetgetAllValues($mElement null, $bSearchInFunctionArguments false)—— 找出Rule内的全部Value对象可按规则名过滤也可决定是否搜索函数参数getSelectorsBySpecificity($sSpecificitySearch)—— 按特异性过滤选择器如getSelectorsBySpecificity( 100)另有expandShorthands()/createShorthands()展开/合并简写属性均已标注 deprecated将在 9.0 移除。五、实战用例解析 → 修改 → 输出5.1 用例一给所有选择器添加 ID 前缀$myId #my_id; $parser new \Sabberworm\CSS\Parser($css); $cssDocument $parser-parse(); foreach ($cssDocument-getAllDeclarationBlocks() as $block) { foreach ($block-getSelectors() as $selector) { // 遍历一个选择器内的所有部分逗号分隔的字符串并前置 ID。 $selector-setSelector($myId. .$selector-getSelector()); } }这个用例展示了Document::getAllDeclarationBlocks()与DeclarationBlock::getSelectors()Selector::setSelector()的组合——无需关心选择器嵌套在多少层media里一次性全局改写选择器。5.2 用例二把所有绝对尺寸缩小一半$parser new \Sabberworm\CSS\Parser($css); $cssDocument $parser-parse(); foreach ($cssDocument-getAllValues() as $value) { if ($value instanceof CSSSize !$value-isRelative()) { $value-setSize($value-getSize() / 2); } }Size::isRelative()用来判断单位是否为相对单位em、%、vh等setSize()则直接修改数值。注意示例中的CSSSize实际类名应为Sabberworm\CSS\Value\Size完整类名见 Size.php。5.3 用例三批量删除不需要的规则$parser new \Sabberworm\CSS\Parser($css); $cssDocument $parser-parse(); foreach($cssDocument-getAllRuleSets() as $oRuleSet) { // 注意追加的短横线会删除所有以 font- 开头的规则 // 如 font-size、font-weight 等以及可能存在的 font 规则本身。 $oRuleSet-removeRule(font-); $oRuleSet-removeRule(cursor); }这正是 4.2 节所述removeRule()通配行为的落地font-前缀匹配把所有font-*与font一并清掉cursor则精确删除该属性。5.4 输出把整个 CSS 文档输出到变量直接调用-render()$parser new \Sabberworm\CSS\Parser(file_get_contents(somefile.css)); $cssDocument $parser-parse(); print $cssDocument-render();想要自定义格式传入一个\Sabberworm\CSS\OutputFormat实例$format \Sabberworm\CSS\OutputFormat::create() -indentWithSpaces(4)-setSpaceBetweenRules(\n); print $cssDocument-render($format);或者使用两个预定义格式print $cssDocument-render(Sabberworm\CSS\OutputFormat::createPretty()); print $cssDocument-render(Sabberworm\CSS\OutputFormat::createCompact());输出格式化的全部能力可参考官方 README 指引的tests/OutputFormatTest.php对应测试在仓库 public/lib/php-css-parser/tests/ 下。六、OutputFormat 的格式能力源码级展开README 只给出三个输出示例但 Moodle 内置的 OutputFormat.php 提供了远超于此的格式化控制点这里做源码级展开字符串引号风格$sStringQuotingType默认可换颜色输出$bRGBHashNotation true尽可能输出#rrggbb哈希记法末条规则分号$bSemicolonAfterLastRule true设为false可省略声明块最后一条规则后的分号各类空格sSpaceAfterRuleName属性名后的空格默认 1 个空格、sSpaceBeforeRules、sSpaceAfterRules、sSpaceBetweenRules、sSpaceBeforeBlocks、sSpaceAfterBlocks、sSpaceBetweenBlocks默认\n、sSpaceBeforeOpeningBrace默认 1 空格等选择器分隔sSpaceBeforeSelectorSeparator/sSpaceAfterSelectorSeparator默认后者为 1 空格控制逗号分隔选择器两边的空白值列表分隔sSpaceBeforeListArgumentSeparator/sSpaceAfterListArgumentSeparator缩进$sIndentation默认\t可用indentWithTabs($iNumber)或indentWithSpaces($iNumber)设置异常与注释bIgnoreExceptionsbeLenient()开启、bRenderComments是否渲染注释。set()方法支持通配符批量设置——例如set(Space*Rules, \n)会同时展开为SpaceBeforeRules、SpaceBetweenRules、SpaceAfterRules三个字段见 OutputFormat.php这正是createPretty()与createCompact()两个预置格式的实现基础createCompact()把所有Space*Rules、Space*Blocks置空并取消SpaceAfterRuleName、SpaceBeforeOpeningBrace、SpaceAfterSelectorSeparator关闭注释渲染得到最小体积输出createPretty()把Space*Rules、Space*Blocks设为\n、SpaceBetweenBlocks设为\n\n、逗号分隔后加空格、开启注释渲染得到易读的美化输出。此外格式化参数默认即render()不传参时是全新OutputFormat此时保留原始的空格设置但不会渲染注释bRenderComments false。七、完整示例输入、内部结构与输出7.1 示例 1At-Rulescharset / font-face / keyframes输入 CSScharset utf-8; font-face { font-family: CrassRoots; src: url(../media/cr.ttf); } html, body { font-size: 1.6em; } keyframes mymove { from { top: 0px; } to { top: 200px; } }结构var_dump() 节选class Sabberworm\CSS\CSSList\Document#4 (2) { protected $aContents array(4) { [0] class Sabberworm\CSS\Property\Charset#6 (2) { private $sCharset class Sabberworm\CSS\Value\CSSString#5 (2) { private $sString string(5) utf-8 protected $iLineNo int(1) } protected $iLineNo int(1) } [1] class Sabberworm\CSS\RuleSet\AtRuleSet#7 (4) { private $sType string(9) font-face private $sArgs string(0) private $aRules array(2) { font-family array(1) { [0] class Sabberworm\CSS\Rule\Rule#8 (4) { private $sRule string(11) font-family private $mValue class Sabberworm\CSS\Value\CSSString#9 (2) { private $sString string(10) CrassRoots protected $iLineNo int(4) } private $bIsImportant bool(false) protected $iLineNo int(4) } } src array(1) { [0] class Sabberworm\CSS\Rule\Rule#10 (4) { private $sRule string(3) src private $mValue class Sabberworm\CSS\Value\URL#11 (2) { private $oURL class Sabberworm\CSS\Value\CSSString#12 (2) { private $sString string(15) ../media/cr.ttf protected $iLineNo int(5) } protected $iLineNo int(5) } private $bIsImportant bool(false) protected $iLineNo int(5) } } } protected $iLineNo int(3) } [2] class Sabberworm\CSS\RuleSet\DeclarationBlock#13 (3) { private $aSelectors array(2) { [0] class Sabberworm\CSS\Property\Selector#14 (2) { private $sSelector string(4) html private $iSpecificity NULL } [1] class Sabberworm\CSS\Property\Selector#15 (2) { private $sSelector string(4) body private $iSpecificity NULL } } private $aRules array(1) { font-size array(1) { [0] class Sabberworm\CSS\Rule\Rule#16 (4) { private $sRule string(9) font-size private $mValue class Sabberworm\CSS\Value\Size#17 (4) { private $fSize double(1.6) private $sUnit string(2) em private $bIsColorComponent bool(false) protected $iLineNo int(9) } private $bIsImportant bool(false) protected $iLineNo int(9) } } } protected $iLineNo int(8) } [3] class Sabberworm\CSS\CSSList\KeyFrame#18 (4) { private $vendorKeyFrame string(9) keyframes private $animationName string(6) mymove protected $aContents array(2) { [0] class Sabberworm\CSS\RuleSet\DeclarationBlock#19 (3) { private $aSelectors array(1) { [0] class Sabberworm\CSS\Property\Selector#20 (2) { private $sSelector string(4) from private $iSpecificity NULL } } private $aRules array(1) { top array(1) { [0] class Sabberworm\CSS\Rule\Rule#21 (4) { private $sRule string(3) top private $mValue class Sabberworm\CSS\Value\Size#22 (4) { private $fSize double(0) private $sUnit string(2) px private $bIsColorComponent bool(false) protected $iLineNo int(13) } private $bIsImportant bool(false) protected $iLineNo int(13) } } } protected $iLineNo int(13) } [2] class Sabberworm\CSS\RuleSet\DeclarationBlock#23 (3) { private $aSelectors array(1) { [0] class Sabberworm\CSS\Property\Selector#24 (2) { private $sSelector string(2) to private $iSpecificity NULL } } private $aRules array(1) { top array(1) { [0] class Sabberworm\CSS\Rule\Rule#25 (4) { private $sRule string(3) top private $mValue class Sabberworm\CSS\Value\Size#26 (4) { private $fSize double(200) private $sUnit string(2) px private $bIsColorComponent bool(false) protected $iLineNo int(14) } private $bIsImportant bool(false) protected $iLineNo int(14) } } } protected $iLineNo int(14) } } protected $iLineNo int(12) } } protected $iLineNo int(1) }输出render()charset utf-8; font-face {font-family: CrassRoots;src: url(../media/cr.ttf);} html, body {font-size: 1.6em;} keyframes mymove {from {top: 0px;} to {top: 200px;}}结构解读charset被解析为Charset属性font-face被解析为AtRuleSetsType font-facehtml, body是一个带两个Selector的DeclarationBlockkeyframes被解析为专门的KeyFrame列表其内部的from/to各自是独立DeclarationBlock。注意Size的bIsColorComponent false标记表明该尺寸不是颜色分量用于区分 0~255 数值的颜色分量与普通尺寸见 Size.php。7.2 示例 2Values多值规则与 !important输入 CSS#header { margin: 10px 2em 1cm 2%; font-family: Verdana, Helvetica, Gill Sans, sans-serif; color: red !important; }结构var_dump() 节选class Sabberworm\CSS\CSSList\Document#4 (2) { protected $aContents array(1) { [0] class Sabberworm\CSS\RuleSet\DeclarationBlock#5 (3) { private $aSelectors array(1) { [0] class Sabberworm\CSS\Property\Selector#6 (2) { private $sSelector string(7) #header private $iSpecificity NULL } } private $aRules array(3) { margin array(1) { [0] class Sabberworm\CSS\Rule\Rule#7 (4) { private $sRule string(6) margin private $mValue class Sabberworm\CSS\Value\RuleValueList#12 (3) { protected $aComponents array(4) { [0] class Sabberworm\CSS\Value\Size#8 (4) { private $fSize double(10) private $sUnit string(2) px ... } [1] class Sabberworm\CSS\Value\Size#9 (4) { private $fSize double(2) private $sUnit string(2) em ... } [2] class Sabberworm\CSS\Value\Size#10 (4) { private $fSize double(1) private $sUnit string(2) cm ... } [3] class Sabberworm\CSS\Value\Size#11 (4) { private $fSize double(2) private $sUnit string(1) % ... } } protected $sSeparator string(1) protected $iLineNo int(2) } private $bIsImportant bool(false) protected $iLineNo int(2) } } font-family array(1) { [0] class Sabberworm\CSS\Rule\Rule#13 (4) { private $sRule string(11) font-family private $mValue class Sabberworm\CSS\Value\RuleValueList#15 (3) { protected $aComponents array(4) { [0] string(7) Verdana [1] string(9) Helvetica [2] class Sabberworm\CSS\Value\CSSString#14 (2) { private $sString string(9) Gill Sans ... } [3] string(10) sans-serif } protected $sSeparator string(1) , protected $iLineNo int(3) } private $bIsImportant bool(false) protected $iLineNo int(3) } } color array(1) { [0] class Sabberworm\CSS\Rule\Rule#16 (4) { private $sRule string(5) color private $mValue string(3) red private $bIsImportant bool(true) protected $iLineNo int(4) } } } protected $iLineNo int(1) } } protected $iLineNo int(1) }输出render()#header {margin: 10px 2em 1cm 2%;font-family: Verdana,Helvetica,Gill Sans,sans-serif;color: red !important;}结构解读margin的四个值组成一个以空格sSeparator 分隔的RuleValueList每个值都是带单位的Sizefont-family是以逗号sSeparator ,分隔的RuleValueList其中无引号的Verdana等是原始字符串、带引号的Gill Sans是CSSStringcolor: red !important中red被保留为普通字符串关键字而!important被记录在Rule的bIsImportant true上。八、Moodle 中的真实应用Boost 主题自动加前缀器README 描述的这套对象模型在 Moodle 内部有直接落地。Moodle 的默认主题 Boost 使用 autoprefixer.php 对主题 CSS 做自动厂商前缀处理该文件顶部大量use Sabberworm\CSS\...导入CSSList、Document、KeyFrame、OutputFormat、Parser、AtRule、Selector、Rule、AtRuleSet、DeclarationBlock、RuleSet、Settings、CSSFunction、CSSString、PrimitiveValue、RuleValueList、Size、ValueList完全是对本库对象模型的系统化使用。其核心流程从源码结构看用Parser解析 SCSS 编译后的 CSS 文本得到Document对象树processBlock()递归遍历CSSList$block-getContents()用instanceof区分AtRule/CSSList/RuleSet三种节点见 autoprefixer.php遇到AtRule尤其KeyFrame时克隆并生成带-webkit-等前缀的变体用insert()插回原列表遇到嵌套CSSList则递归遇到RuleSet则交给processDeclaration()处理processDeclaration()遍历声明块内的Rule对需要前缀的属性名做改写见 autoprefixer.php 起的逻辑。这正体现了 README 中用instanceof检查节点类型与CSSList可递归包含等描述的实际工程价值——对象树模型让遍历、克隆、插入、改写这类 CSS 转换操作变得声明式且安全。九、To-Do 与已知边界官方 README 明确列出了尚未实现的能力使用前应了解这些边界更多便捷方法如selectorsWithElement($sId/Class/TagName)、attributesOfType($type)、removeAttributesOfType($type)尚待补充真正的多字节支持尚不完善目前仅支持前 255 个码点都只占一字节且与 ASCII 一致的多字节字符集UTF-8 恰好符合该描述这与 3.3 节关闭多字节函数通常没问题的说明相互印证命名颜色支持用Color对象而非匿名字符串字面量尚在规划中——这也是示例 2 中red被保留为普通字符串的原因。十、测试与维护官方 README 建议运行全部单元测试先composer install安装 phpunit再执行./vendor/bin/phpunit。对应的测试用例位于仓库 public/lib/php-css-parser/tests/ 目录含官方 README 提到的OutputFormatTest.php。此外 composer.json 中还配置了 PHP CS Fixer、PHP_CodeSniffer、PHPStan 等静态检查脚本composer ci可一键执行ci:php:fixer、ci:php:sniffer、ci:php:stan。结语PHP CSS Parser 用一套清晰的对象模型Document → CSSList → RuleSet → Rule → Value把 CSS 从字符串升级为可编程结构。结合本仓库的 Parser.php、Settings.php、OutputFormat.php 等源码以及 Boost 主题 autoprefixer 的真实用例无论是做主题定制、样式清理、批量改写还是样式压缩你都可以像操作普通 PHP 对象一样安全地读-改-写CSS。赞分享教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载相关推荐Moodle 内置的 PHP CSS Parser解析、操作与输出 CSS 的完整版本演进指南Moodle 内置的 PHP CSS Parser解析、操作与输出 CSS 的完整版本演进指南 本文以 Moodle 仓库内置的第三方库 sabberworm教育后端前端Open WebUI 知识库实战指南3 步跑通文档问答附向量库选型与避坑Open WebUI 知识库实战指南3 步跑通文档问答附向量库选型与避坑 想把手头一摞内部文档直接喂给大模型让它答得有理有据Open WebUI 内置的人工智能大模型AI 应用RAGAI Agent本地部署交互助手后端前端深入理解Kotlin/Native构建输出文件结构与内容解析指南深入理解Kotlin/Native构建输出文件结构与内容解析指南 Kotlin/Native作为JetBrains推出的跨平台开发技术允许开发者使用Kotl编程语言编译器标准库语言运行时上一篇终极Adobe Illustrator自动化脚本集30免费工具让你的设计效率飙升300%下一篇探索AI与Web3的融合Awesome Web3中的LLM与MCP应用完整指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考