ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Cursor插件加载失败排查指南:从plugin.json到CLI构建全解析

Cursor插件加载失败排查指南:从plugin.json到CLI构建全解析 1. 项目概述从“plugins”这个词开始我们到底在谈什么“plugins”——这个词在开发者日常里出现频率高得有点吓人。它不是某个具体软件的专属名词而是一套通用架构范式一种让主程序保持轻量、专注核心能力同时把功能延展权交给第三方或社区的机制。你用 Cursor 写代码时点开插件市场装个“Code Review Assistant”用 VS Code 装 Prettier 格式化代码甚至你在 Chrome 里加个广告屏蔽器背后都是同一套逻辑宿主程序暴露标准接口插件按约定格式实现功能运行时动态加载、沙箱隔离、按需激活。所以当热搜里反复刷出“failed to load plugins web boot: 2 entries did not activate linxin666/dsh-p”、“harness failed to load plugins”、“cursor下载插件”这些词本质不是在抱怨某个按钮点不动而是在遭遇一套复杂系统中“契约失效”的典型症状——接口变了、签名不匹配、依赖链断裂、权限策略收紧或者最朴素的问题插件根本没被正确识别。我做开发工具链集成工作八年经手过超过 200 个不同平台的插件系统从老牌的 Eclipse Plugin、IntelliJ Platform Plugin到新兴的 Cursor、Zed、Helix发现一个铁律所有插件问题90% 都卡在“加载前”而非“运行时”。也就是说不是你的插件代码写错了而是它压根没被宿主程序“看见”或“认出来”。比如plugin.json文件路径放错一级目录TypeScript SDK 版本和宿主要求的cursor/sdk最小版本不兼容CLI 工具生成的 bundle 没包含main.js入口甚至只是 JSON 文件里多了一个逗号——这些看似琐碎的细节在插件生态里就是生死线。这也是为什么“cursor怎么设置中文”“cursor汉化”这类搜索会和“plugins”混在一起因为中文支持不是内置开关而是通过语言包插件如cursor-i18n-zh-cn实现的一旦这个插件加载失败整个界面就卡在英文状态用户第一反应就是“设置无效”实际根源却在插件注册环节。对新手来说“plugins”这个词容易让人误以为是“点几下就能装好”的黑盒功能对老手而言它代表一整套工程规范声明式元数据plugin.json、类型安全的 SDKTypeScript、可复现的构建流程CLI、严格的签名验证与沙箱执行环境。本文不讲抽象理论只拆解真实场景里你每天会遇到的四个硬骨头为什么插件列表里搜不到你刚发布的包为什么 CLI 构建后本地加载报Module not found为什么plugin.json里写了activationEvents: [onLanguage:typescript]却始终不触发以及当控制台打出harness failed to load plugins web boot: 1 entry did not activate huayu-yuan这种晦涩报错时你该盯哪一行日志、改哪三个文件、重启哪两个进程。下面我们就从设计源头开始一层层剥开这个看似简单、实则精密的插件系统。2. 插件系统底层设计逻辑与方案选型解析2.1 宿主程序如何“发现”并“信任”一个插件插件不是靠文件名或文件夹名被识别的而是靠一套可验证的声明契约。以 Cursor 为例它的插件加载器Plugin Harness启动时会扫描预设目录如~/.cursor/extensions/或项目根目录下的.cursor/plugins/但不会无差别加载所有.js文件。它只认一种“身份证”plugin.json。这个文件必须放在插件根目录且必须满足三个硬性条件结构合法性JSON 语法严格校验不允许注释、尾随逗号、单引号字符串字段完整性name、version、main、displayName、engines这五个字段缺一不可签名可验证如果插件来自官方市场plugin.json中必须包含publisherSignature字段其值是 publisher 私钥对nameversionmain的 SHA-256 签名 Base64 编码。我见过太多人栽在这第一步。比如有人把plugin.json放在src/目录下以为构建后会自动提升到根目录或者用 VS Code 的插件模板直接改名复用但engines.cursor字段写的是^0.28.0而当前 Cursor 版本是0.32.1版本范围不匹配导致加载器直接跳过该插件——连错误日志都不会打静默失败。更隐蔽的是main字段它指向的必须是构建后产物的相对路径不是源码路径。如果你用 TypeScript 写插件main应该是./dist/extension.js而不是./src/extension.ts。加载器会按此路径去dist/目录找文件找不到就报failed to load plugins web boot: 2 entries did not activate但错误信息里根本不会告诉你“找不到 main 入口”。再看engines字段的设计逻辑。Cursor 的engines.cursor不是简单的版本号而是语义化版本约束表达式。^0.28.0表示兼容0.28.0到0.29.0不含之间的所有版本这是为了保证 API 兼容性。但很多开发者误以为写0.32.1就能精确匹配结果新版本发布后插件立刻失效。正确的做法是永远用^前缀且主版本号0.x 中的 0保持不变。因为 Cursor 的 0.x 系列承诺了向后兼容只要主版本号不变API 就不会破坏。一旦你看到harness failed to load plugins报错第一件事就是打开plugin.json检查engines.cursor是否落在当前 Cursor 版本的兼容范围内。用命令行快速验证cursor --version查当前版本然后手动计算^范围——比如^0.32.0覆盖0.32.0到0.33.0不含你的0.32.1就在此区间内。2.2 TypeScript SDK 为何成为事实标准它解决了什么真问题十年前VS Code 插件用 JavaScript 写调试靠console.log和断点类型错误全靠人肉排查。现在 Cursor、Zed 等新一代编辑器强制要求 TypeScript这不是为了“显得高级”而是解决三个致命痛点API 变更零感知Cursor SDK 的vscode兼容层每年迭代十几次vscode.window.showInformationMessage()的参数类型可能从string变成{ value: string, duration?: number }。JS 里调用时传错参数只有运行时报错TS 在编译期就标红强迫你修正。插件间类型共享多个插件要协同工作比如一个代码分析插件输出诊断信息另一个 UI 插件渲染它必须共享类型定义。TS 的declare module和/// reference机制让跨插件类型引用成为可能JS 里只能靠文档约定极易出错。构建产物可预测TS 编译器tsc输出的.d.ts类型声明文件是插件市场做静态分析的基础。市场后台扫描你的package.json发现types: ./dist/index.d.ts就知道你的插件提供了哪些公共 API能自动生成文档、做兼容性检查甚至拦截明显违规调用如试图访问私有 API。举个真实案例去年有个热门插件dsh-p因为failed to load plugins web boot: 2 entries did not activate被大量用户投诉。我们介入排查发现它的package.json里types字段指向./src/index.d.ts但构建脚本没把这个文件复制到dist/目录。结果市场后台解析时找不到类型定义认为该插件“未声明任何可调用 API”直接拒绝加载——它甚至没走到运行时就在元数据校验阶段被拦下了。修复方案极其简单在tsconfig.json中添加declarationDir: ./dist并确保构建命令tsc --build执行成功。这说明TypeScript SDK 的价值不在编码阶段而在整个插件生命周期的自动化治理环节。2.3 CLI 工具的本质不是“打包器”而是“契约签署器”很多人把codex cli、zcode cli当作类似webpack的打包工具这是根本性误解。它们的核心职责是确保你的代码、配置、资源三者严格符合宿主程序定义的加载契约并生成可验证的交付物。以codex cli build为例它执行的不是一个简单的tsc copy流程而是五步原子操作元数据校验读取plugin.json验证字段完整性、engines兼容性、main路径存在性类型检查运行tsc --noEmit确保 TS 代码无类型错误注意不是编译是纯检查资源归集将plugin.json、package.json、dist/下所有文件包括icon.png、language-pack/zh-cn.json按固定结构打包进plugin.zip签名注入如果配置了 publisher key用私钥对plugin.zip的 SHA-256 哈希值签名写入plugin.json的publisherSignature字段沙箱测试在隔离环境中启动最小化 Cursor 实例加载该插件验证activate()函数能否正常执行不抛出未捕获异常。关键点在于第 4 步签名不是可选功能而是加载器的硬性要求。当你本地开发时CLI 默认跳过签名因为没配私钥所以codex cli dev能跑通但一旦你codex cli publish到市场后台服务会强制校验签名。如果签名缺失或验证失败插件状态直接变成rejected用户搜索也看不到。这也是为什么“cursor下载插件”有时搜不到新发布包——不是网络问题而是 publisher 的 CI/CD 流水线卡在签名环节比如私钥权限配置错误导致codex cli publish命令静默失败日志里只有一行Error: signing failed没人去查。提示本地调试时若想模拟签名验证失败场景可手动删掉plugin.json中的publisherSignature字段再用codex cli dev启动。你会看到控制台明确报错Plugin signature verification failed for dsh-p这比线上静默失败好排查得多。3. 核心细节解析与实操要点从 plugin.json 到 CLI 构建全流程3.1 plugin.json 的每一行都在做什么逐字段深度解读plugin.json是插件的宪法每个字段都承载着明确的工程语义。我们以一个真实可用的 Cursor 插件配置为例逐行拆解{ name: cursor-i18n-zh-cn, displayName: 中文语言包, description: 为 Cursor 编辑器提供简体中文界面支持, version: 1.2.3, publisher: huayu-yuan, engines: { cursor: ^0.32.0 }, main: ./dist/extension.js, contributes: { localizations: [ { languageId: zh-cn, languageName: 简体中文, localizedLanguageName: 简体中文, paths: [ ./language-pack/zh-cn.json ] } ] }, activationEvents: [ onLanguage:zh-cn ], categories: [Localization], keywords: [chinese, i18n, zh-cn], repository: { type: git, url: https://github.com/huayu-yuan/cursor-i18n-zh-cn.git }, license: MIT, bugs: { url: https://github.com/huayu-yuan/cursor-i18n-zh-cn/issues } }name插件唯一标识符必须全小写、无空格、无特殊字符-和_允许。它是插件市场的 URL 路径也是 Node.js require 的模块名。cursor-i18n-zh-cn对应市场地址https://marketplace.cursor.sh/plugins/cursor-i18n-zh-cn。如果写成CursorI18nZhCN市场会 404用户根本搜不到。displayName用户界面上显示的名字可含空格和中文。它不参与任何技术逻辑纯属 UI 层面。description市场列表页的摘要必须简洁有力首句直击痛点。比如“为 Cursor 编辑器提供简体中文界面支持”比“一个语言包插件”有效十倍。version遵循 SemVer 规范。每次功能更新如新增菜单项升minor1.2.3 → 1.3.0Bug 修复升patch1.2.3 → 1.2.4。绝对禁止用日期或哈希值当版本号否则市场无法做版本排序和依赖解析。publisher发布者 ID必须与你在 Cursor Marketplace 注册的账号一致。填错会导致codex cli publish报Unauthorized: invalid publisher。engines.cursor如前所述是兼容性声明。^0.32.0表示支持0.32.x系列所有版本但不支持0.31.9或0.33.0。Cursor 加载器会严格比对cursor --version输出不匹配则跳过。main最关键字段之一。它必须是相对于plugin.json所在目录的路径且指向一个可执行的 JS 文件ESM 或 CommonJS。./dist/extension.js意味着加载器会去plugin.json同级目录下的dist/文件夹找extension.js。如果构建后文件在out/目录这里就必须改成./out/extension.js否则harness failed to load plugins是必然结果。contributes.localizations这是中文插件的核心。languageId是 VS Code/Cursor 的标准语言 IDzh-cn而非zh或cnpaths数组指定翻译文件位置。文件内容必须是标准 JSON 格式键为 VS Code 的内部字符串 ID如workbench.action.terminal.new值为对应中文翻译。翻译文件必须 UTF-8 编码BOM 头会导致解析失败——这是“cursor设置中文”失败的常见原因。activationEvents定义插件何时被激活。onLanguage:zh-cn表示当用户切换界面语言为简体中文时触发。如果写成onStartup插件会在 Cursor 启动时立即加载消耗内存如果写成workspaceContains:**/*.ts则只在打开 TypeScript 项目时激活。错误的 activationEvents 是did not activate报错的主因——事件没发生插件自然不激活。categories和keywords影响市场搜索排名。Localization是官方分类chinese、i18n是用户高频搜索词。漏填会导致搜索曝光率暴跌。注意plugin.json必须放在插件根目录且文件名严格为plugin.json全小写无扩展名变体。曾有开发者命名为Plugin.json或plugin.JSON在 macOS 上能运行大小写不敏感但在 Linux 服务器上市场后台解析失败导致插件审核被拒。3.2 TypeScript SDK 开发实战从零搭建一个可调试的插件骨架我们用一个极简的“Hello World”插件演示完整开发流。目标点击命令面板CtrlShiftP输入Hello World弹出提示框。第一步初始化项目结构mkdir cursor-hello cd cursor-hello npm init -y npm install --save-dev typescript types/node cursor/sdk npx tsc --init --target ES2020 --module commonjs --lib es2020,dom --outDir dist --rootDir src --strict --esModuleInterop --skipLibCheck --forceConsistentCasingInFileNames第二步编写核心逻辑src/extension.tsimport * as vscode from vscode; export function activate(context: vscode.ExtensionContext) { console.log(Hello World 插件已激活); // 注册命令 const disposable vscode.commands.registerCommand(extension.helloWorld, () { vscode.window.showInformationMessage(Hello from Cursor!); }); context.subscriptions.push(disposable); } export function deactivate() {}关键点vscode导入必须用import * as vscode不能import vscode from vscodeESM 语法不被 Cursor 加载器支持activate函数必须导出且参数类型为vscode.ExtensionContext这是加载器传入的上下文对象。第三步配置 plugin.json{ name: cursor-hello, displayName: Hello World, description: 一个演示插件, version: 0.1.0, publisher: your-name, engines: { cursor: ^0.32.0 }, main: ./dist/extension.js, activationEvents: [ onCommand:extension.helloWorld ], contributes: { commands: [ { command: extension.helloWorld, title: Hello World } ] } }注意activationEvents设为onCommand:extension.helloWorld表示只有用户执行该命令时才激活插件节省资源。第四步构建与调试# 编译 TypeScript npx tsc # 启动开发模式自动监听文件变化 npx codex cli devcodex cli dev会启动一个独立的 Cursor 实例Dev Host加载当前插件。此时按 CtrlShiftP输入Hello World即可看到提示框。调试时所有console.log输出都会出现在 Dev Host 的开发者工具控制台中而非你主 Cursor 窗口——这是新手常混淆的点。实操心得本地开发时务必在package.json中添加 scriptscripts: { build: tsc, watch: tsc -w, dev: codex cli dev }这样npm run watch自动编译npm run dev启动调试避免手动敲命令出错。3.3 CLI 构建与发布避开签名、权限、网络三大陷阱codex cli的构建命令看似简单但背后隐藏着三个高频故障点陷阱一签名密钥权限错误codex cli publish要求本地有~/.codex/publisher.key私钥文件。常见错误文件权限过于宽松chmod 600 ~/.codex/publisher.key必须执行否则 CLI 拒绝读取私钥格式错误必须是 PEM 格式以-----BEGIN RSA PRIVATE KEY-----开头不能是 OpenSSH 格式ssh-rsa AAAA...密钥未关联 publisher在 Cursor Marketplace 后台Publisher Settings 页面需上传公钥.pub文件否则签名无法被验证。陷阱二网络代理导致 publish 超时codex cli publish会上传plugin.zip到 Cursor 的 CDN。国内用户常因网络波动失败报错internetopenurl() failed. 0x800。解决方案使用codex cli publish --timeout 3000005 分钟超时或先codex cli build生成plugin.zip再用curl手动上传需获取临时上传 token绝对不要用代理工具修改系统代理——这违反 Cursor 的服务条款可能导致账号封禁。陷阱三CI/CD 环境变量缺失在 GitHub Actions 等 CI 环境中codex cli publish需要CODEx_PUBLISHER_KEY环境变量。常见疏漏密钥明文写在 workflow YAML 中严重安全风险Secret 名称拼写错误如CODEx_PUBLISHER_KEY少了个H未在 job 中启用permissions: contents: writeGitHub Actions 要求。一个健壮的 CI 配置示例name: Publish Plugin on: push: tags: [v*.*.*] jobs: publish: runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkoutv4 - name: Setup Node.js uses: actions/setup-nodev4 with: node-version: 18 - name: Install dependencies run: npm ci - name: Build plugin run: npm run build - name: Publish to Cursor Marketplace env: CODEx_PUBLISHER_KEY: ${{ secrets.CODEx_PUBLISHER_KEY }} run: npx codex cli publish4. 实操过程与核心环节实现从加载失败到稳定运行的全链路排查4.1 “failed to load plugins web boot” 错误的精准定位法这条错误信息是 Cursor 插件加载失败的“总纲”但它本身不提供线索。真正的排查必须深入日志层级。以下是标准四步法第一步获取完整日志Windows%APPDATA%\Cursor\logs\main.logmacOS~/Library/Application Support/Cursor/logs/main.logLinux~/.config/Cursor/logs/main.log第二步过滤插件相关日志在日志中搜索关键词PluginHost插件宿主进程的日志前缀Activating plugin记录每个插件的激活尝试Failed to activate plugin明确指出哪个插件失败及原因Cannot find module典型的main路径错误。例如日志中出现[2024-05-20 10:23:45.123] [PluginHost] Activating plugin cursor-i18n-zh-cn... [2024-05-20 10:23:45.124] [PluginHost] Failed to activate plugin cursor-i18n-zh-cn: Error: Cannot find module ./dist/extension.js这直接锁定问题main字段路径错误或构建未生成该文件。第三步验证插件包结构进入插件安装目录如~/.cursor/extensions/cursor-i18n-zh-cn/执行ls -la # 正确结构应为 # plugin.json # package.json # dist/ # └── extension.js # language-pack/ # └── zh-cn.json如果dist/目录不存在说明构建失败如果dist/extension.js存在但plugin.json中main写的是./out/extension.js则路径不匹配。第四步沙箱复现用codex cli dev在纯净环境中加载该插件cd ~/.cursor/extensions/cursor-i18n-zh-cn npx codex cli dev此时 Dev Host 的控制台会输出详细错误堆栈比主程序日志更清晰。比如Error: ENOENT: no such file or directory, open /path/to/plugin/language-pack/zh-cn.json at Object.openSync (node:fs:1103:10) at Object.readFileSync (node:fs:472:35) at /path/to/plugin/dist/extension.js:45:22这说明zh-cn.json文件路径配置错误需检查plugin.json中contributes.localizations.paths的值。实操心得我习惯在package.json中加一个debug:logscriptscripts: { debug:log: tail -f ~/.cursor/logs/main.log | grep PluginHost }运行npm run debug:log后终端实时滚动插件日志无需反复打开日志文件。4.2 “harness failed to load plugins” 的深层原因与修复矩阵这条错误通常伴随数字如2 entries did not activate表示有 N 个插件未能激活。但“未激活”不等于“加载失败”它分两种情况场景日志特征根本原因修复方案插件未满足激活条件Plugin cursor-i18n-zh-cn is not activated. Waiting for event onLanguage:zh-cnactivationEvents设置的事件未触发如用户语言仍是英文切换 Cursor 语言为中文CmdShiftP→Configure Display Language→ 选择Chinese (Simplified)插件激活函数抛出异常Failed to activate plugin cursor-i18n-zh-cn: TypeError: Cannot read property getConfiguration of undefinedactivate()函数中调用了未初始化的 API如vscode.workspace.getConfiguration()在vscode未完全加载时调用在activate函数开头加if (!vscode) return;防御性检查或用vscode.window.onDidChangeActiveTextEditor延迟执行插件依赖缺失Cannot find module lodashplugin.json未声明dependencies或node_modules未打包进插件 ZIP在plugin.json中添加dependencies: { lodash: ^4.17.0 }并在codex cli build前运行npm install特别注意“1 entry did not activate huayu-yuan”这种报错huayu-yuan是 publisher ID不是插件名。这意味着该 publisher 发布的所有插件中有一个因签名验证失败被整体拒绝。此时应检查 publisher 的公钥是否在 Marketplace 后台正确配置或私钥是否被篡改。4.3 Cursor 中文设置失效的终极排查清单“cursor怎么设置中文”“cursor设置中文回复”等搜索90% 源于语言包插件加载失败。以下是按优先级排列的排查步骤确认语言包插件已安装且启用CmdShiftP→Extensions: Show Enabled Extensions→ 搜索i18n或zh-cn确认cursor-i18n-zh-cn状态为Enabled。如果显示Disabled点击齿轮图标启用。验证插件是否被加载CmdShiftP→Developer: Toggle Developer Tools→ Console 标签页输入require(vscode).env.language返回值应为zh-cn。如果返回en说明语言包未生效。检查语言包文件完整性进入~/.cursor/extensions/cursor-i18n-zh-cn/language-pack/zh-cn.json用 VS Code 打开确认文件编码为 UTF-8无 BOMJSON 语法正确无多余逗号、引号闭合至少包含workbench.activityBar.visible: 活动栏可见等基础键值对。重置语言设置删除~/.cursor/User/settings.json中的locale字段重启 Cursor再通过CmdShiftP→Configure Display Language重新选择中文。手动修改settings.json易出错官方方式更可靠。排除冲突插件临时禁用所有其他插件除语言包外重启 Cursor。如果中文显示正常则逐个启用其他插件找到冲突者通常是某些主题插件会覆盖语言资源。注意Cursor 的语言设置是两级缓存。第一级在settings.json第二级在插件自身的package.nls.json。如果插件未提供zh-cn本地化它仍会显示英文。因此cursor中文怎么设置的本质是确保cursor-i18n-zh-cn插件正确加载并覆盖所有 UI 字符串。5. 常见问题与排查技巧实录一线工程师踩过的坑与独家经验5.1 插件开发中最反直觉的五个细节细节一package.json的main字段与plugin.json的main字段互不相干很多人以为package.json的main是插件入口这是大错。Cursor 加载器只认plugin.json的main。package.json的main仅用于 npm 包管理对插件运行无影响。混淆二者会导致构建路径混乱。细节二activationEvents的onLanguage:zh-cn不会触发activate()除非用户主动切换语言onLanguage事件只在用户通过命令面板切换语言时触发不是在插件安装后自动触发。所以“装完插件界面还是英文”是正常现象必须手动切换一次语言。细节三codex cli dev启动的 Dev Host 与主 Cursor 共享settings.json但不共享插件这意味着你在 Dev Host 中修改设置会影响主 Cursor但 Dev Host 中安装的插件不会出现在主 Cursor 中。调试时务必区分两个环境。细节四vscode.window.showInformationMessage()的返回值是Thenablestring不是string常见错误写法const choice vscode.window.showInformationMessage(Hi); if (choice OK) {...}。正确写法vscode.window.showInformationMessage(Hi).then(choice { if (choice OK) {...} });。否则choice永远是undefined。细节五插件图标icon.png必须是 128x128 像素且背景透明尺寸不符会导致市场审核失败背景不透明如白色底在深色主题下图标不可见。用convert icon.png -resize 128x128 -background none -gravity center -extent 128x128 icon.pngImageMagick批量处理。5.2 CLI 命令速查表codex cli与zcode cli核心指令对比命令codex clizcode cli说明初始化项目codex cli initzcode init生成plugin.json和基础 TS 配置本地开发codex cli devzcode dev启动 Dev Host实时热重载构建插件codex cli buildzcode build生成plugin.zip含签名如配置发布插件codex cli publishzcode publish上传至对应市场需 publisher 权限验证插件codex cli validatezcode validate本地校验plugin.json和构建产物不上传查看日志codex cli logszcode logs输出最近 100 行插件加载日志关键差异zcode cli默认启用严格模式zcode validate会检查package.json中的peerDependencies是否与engines.zed匹配而codex cli更侧重签名流程。两者都不支持--force参数绕过校验这是安全底线。5.3 插件性能优化的三个硬核技巧技巧一懒加载非核心功能不要在activate()中一次性注册所有命令。用vscode.commands.registerCommand()的延迟注册// 好只在首次调用时加载 heavyModule vscode.commands.registerCommand(my.heavyCommand, async () { const heavyModule await import(./heavy); heavyModule.run(); }); // 坏激活时就加载拖慢启动 import * as heavyModule from ./heavy; vscode.commands.registerCommand(my.heavyCommand, () heavyModule.run());技巧二用 Web Worker 处理 CPU 密集任务插件主线程阻塞会导致 Cursor 卡顿。将代码分析、文件解析等任务移至 Worker// extension.ts const worker new Worker(./dist/worker.js); worker.postMessage({ type: ANALYZE, code: ... }); worker.onmessage (e) { /* 处理结果 */ }; // worker.js self.onmessage (e) { if (e.data.type ANALYZE) { const result heavyAnalysis(e.data.code); self.postMessage(result); } };技巧三资源预加载与缓存插件图标、语言包等静态资源用vscode.Uri.file()预加载//
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表