{"_id":"@10coding/vite-plugin-jsx-scoped","_rev":"6-27a0447b6bb53465596f34ba737f06be","name":"@10coding/vite-plugin-jsx-scoped","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@10coding/vite-plugin-jsx-scoped","version":"0.1.0","license":"MIT","_id":"@10coding/vite-plugin-jsx-scoped@0.1.0","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"dist":{"shasum":"fbe64d50e98dcf7db3eca38e872b1f3391c628f9","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.1.0.tgz","fileCount":9,"integrity":"sha512-yv44r1B/9TFguagGURGWqw77tD3oxGnwdxsR6hDHcnjMvmcSaTo4rlGpde7RGy0ShnczNWFziBYuPemrxGAW+w==","signatures":[{"sig":"MEUCIBybdz3FSH7ZVnSZvkmD7zbRXeKCnP+g2pMXHJ9hrEteAiEAwGat4s/mf6PEpyfV2YRK+027ZZhVYgLOdFuB3UzYjCI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103112},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.1.0","@10coding/postcss-jsx-scoped":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vite-plugin-jsx-scoped_0.1.0_1788520489357_0.07733112275385845","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@10coding/vite-plugin-jsx-scoped","version":"0.2.0","license":"MIT","_id":"@10coding/vite-plugin-jsx-scoped@0.2.0","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"dist":{"shasum":"abcf2c2cbfcc4a9969be5cd9df288fbdfc1aa7b6","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.2.0.tgz","fileCount":9,"integrity":"sha512-lEQiEI09SK5UnVU7+5sOp7GoXIhiuNNN0m2YMptUu98sLw/f84csSaWGb4xVdnCHOCsgdOmoNVtr/KKcvSgPKw==","signatures":[{"sig":"MEQCIDinSbWjYe0wYdpGcHdzX5jOtHmzysHmEGZ1/irgJReqAiAj0GLA5u9oHVCeu2jyT6JOLWmoOGLFu340uX2MSo6AvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHlyG9f06GdRuBgu3pIhk9IYP9iTlfsYDNK5d4Vgc1duAiEAjAnmWb86QpxkPq1WeWmnWdlCX7l0o6qF7b8M4j14EYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145529},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.1.0","@10coding/postcss-jsx-scoped":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vite-plugin-jsx-scoped_0.2.0_1788531667738_0.8858236499869014","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@10coding/vite-plugin-jsx-scoped","version":"0.3.0","license":"MIT","_id":"@10coding/vite-plugin-jsx-scoped@0.3.0","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"dist":{"shasum":"bd9077074b932353776ce20db1b1337582429254","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.3.0.tgz","fileCount":9,"integrity":"sha512-MSZptYRP0lxH6ONZpDxsJrs9mC66srpOzwn/J+J3mH0TDZfVHiVOCv+cSoG5OYEWEr1fT4k9sF5O8olsfpQx2g==","signatures":[{"sig":"MEYCIQD9NPMsYJ7YCMzLG6bNjgIZSbBcXxNmFDcgI8rhaA4MegIhAOw3FzUITCiUV9YOjpTp5d7YKxW/w9EAwW+51nvjgqV7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC3ov+YETqyrDv7/K5SBkzpKcaETUPB4fxCbW58OsX2zAiEA4uPMVOX9nmlKD98VpOnTPnE2XZ8f0Eijkkln6k/FUXU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171548},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.1.0","@10coding/postcss-jsx-scoped":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vite-plugin-jsx-scoped_0.3.0_1788572728962_0.10455065925785711","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@10coding/vite-plugin-jsx-scoped","version":"0.4.0","license":"MIT","_id":"@10coding/vite-plugin-jsx-scoped@0.4.0","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"dist":{"shasum":"de3d19ff4acca5c9f983a11692c676c585de4369","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.4.0.tgz","fileCount":9,"integrity":"sha512-Wrk22LuGkFmVmLrQscJGR8HXMmgQZSPjF+L+JKlrVW/D2pQxJN2rALfaW9E3DYlVco35qqxsLs1SlJn4OLJH+Q==","signatures":[{"sig":"MEQCIArSApuVHIs/5n4Y7xxNpTabdsP75TlcIB9AjS5Eba6kAiAoAk8p8lGWsidCLwGwfFr+DLic6bH8NvMZJFbuMhj7fA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCy77n2WLsdyBNM0oGvtVtn64rHBRXo1cEMxbKGD/DVTgIhAN+tmkDR3vcq2XxIb6oOZnIQonMNsROJaSsgV7hRXCdo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173737},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.2.0","@10coding/postcss-jsx-scoped":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vite-plugin-jsx-scoped_0.4.0_1788584120275_0.2323624025994171","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@10coding/vite-plugin-jsx-scoped","version":"0.4.1","license":"MIT","_id":"@10coding/vite-plugin-jsx-scoped@0.4.1","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"dist":{"shasum":"390cd9434fcc849819d9e0f6b80a89b31579a365","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.4.1.tgz","fileCount":9,"integrity":"sha512-cvpPqleT6xTXubqC3llLEeDTQo871KCcbu/ASEGDRsOZRayOdB6ORLCQKYqCqZiJ/9L1GJIr5bEauwT9Jc77Cw==","signatures":[{"sig":"MEYCIQCxdRelKwopnVGEwqueBnc6fUgTW+H6xJfvxy5jKNm+7QIhALX1AJiOi0HuPaJctnWBXr1oKK2L2NP2416ZdcumXrGA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBBnjMAuvfjGKaxpJM1Bjm8Y/Kym+kw2j9Y17jkPkcyAAiEA0BQFXpcoJ1fgaDM+iRQ6JYuGHbFkK6/g5DSNsBdgwqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174858},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.2.0","@10coding/postcss-jsx-scoped":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/vite-plugin-jsx-scoped_0.4.1_1789017287122_0.6675704612086233","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@10coding/vite-plugin-jsx-scoped@0.5.0","dist":{"shasum":"ee6e1b26ea43cd2d4bf2cbd65d25dd1d9d9cac2a","tarball":"https://registry.npmjs.org/@10coding/vite-plugin-jsx-scoped/-/vite-plugin-jsx-scoped-0.5.0.tgz","fileCount":9,"integrity":"sha512-4HrFr15WKFNqTO5ep2qlM1X1Rh82JIi7VuvRr/bmuEtjVKzrxJzlQM8xg013QKr6pIPAOpyT8s+ew+W9ENxHLA==","signatures":[{"sig":"MEUCIHHfey1FInk4AZ4gVmSfTd3bGPsdS9vN3nPlVUJzp+XKAiEApK5kdnm+8xAFa0k9Uk0hW4Y4ClomFXuklVWulzPbLMY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDgjFZ0BSgxswSZF7fMp4MiTLJgweY/lYiq3X+Qiem2MwIhAIQjW+G/ZJYFftFm9Fc06jF2QWxISYy+ngapRjSE2IsN"}],"unpackedSize":187020},"main":"./dist/index.cjs","name":"@10coding/vite-plugin-jsx-scoped","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./client":{"types":"./client.d.ts"}},"license":"MIT","scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"version":"0.5.0","_npmUser":{"name":"scliuyilin","email":"scliuyilin@163.com"},"description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","directories":{},"maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"@babel/core":"^7.26.0","@10coding/plugin-jsx-scoped":"0.2.0","@10coding/postcss-jsx-scoped":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"less":"^4.2.0","sass":"^1.83.0","tsup":"^8.3.5","vite":"^6.0.7","typescript":"^5.7.2","@types/less":"^3.0.3","@types/node":"^22.10.0","@types/babel__core":"^7.20.5"},"peerDependencies":{"vite":"^5.0.0 || ^6.0.0 || ^7.0.0"},"peerDependenciesMeta":{"less":{"optional":true},"sass":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vite-plugin-jsx-scoped_0.5.0_1790704439023_0.560954114038839"}}},"time":{"created":"2026-09-04T11:14:49.152Z","modified":"2026-09-29T17:53:59.348Z","0.1.0":"2026-09-04T11:14:49.494Z","0.2.0":"2026-09-04T14:21:07.824Z","0.3.0":"2026-09-05T01:45:29.053Z","0.4.0":"2026-09-05T04:55:20.354Z","0.4.1":"2026-09-10T05:14:47.217Z","0.5.0":"2026-09-29T17:53:59.120Z"},"license":"MIT","description":"Vite plugin for Vue-like scoped styles in JSX/TSX (React): scopes *.scoped.{css,scss,less} imports and inline <style scoped> with a data-v-{hash} derived from the component file path","maintainers":[{"name":"scliuyilin","email":"scliuyilin@163.com"}],"readme":"# @10coding/vite-plugin-jsx-scoped\n\nVite 主入口插件：为 React/Preact 等 JSX 框架提供 **Vue-like scoped 样式隔离**。\n\n## 安装\n\n```bash\npnpm add -D vite @10coding/vite-plugin-jsx-scoped\n# 可选：用到 scss/sass / less 时安装对应编译器\npnpm add -D sass less\n```\n\n> 内部依赖 `@10coding/plugin-jsx-scoped`（注入 `data-v-*`）与\n> `@10coding/postcss-jsx-scoped`（选择器追加 `[data-v-*]`），会随本包自动安装。\n\n## 用法\n\n```ts\n// vite.config.ts —— jsxScoped 必须在 react()/preact() 之前！\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\nimport jsxScoped from '@10coding/vite-plugin-jsx-scoped'\n\nexport default defineConfig({\n  plugins: [jsxScoped({ warnMultiScopedImport: true }), react()],\n})\n```\n\n## 类型声明：消除 `*.scoped.*` 导入报错（TS2307）\n\n`*.scoped.scss` 这类命名约定没有内置 TS 声明，直接 `import './demo.scoped.scss'`\n可能报 `Cannot find module './demo.scoped.scss' or its corresponding type declarations`。\n本包附带模块声明文件，在 tsconfig 的 `types` 字段引入即可：\n\n```jsonc\n// tsconfig.json\n{\n  \"compilerOptions\": {\n    \"types\": [\"vite/client\", \"@10coding/vite-plugin-jsx-scoped/client\"]\n    // 可选：TS 5.6+ 开启副作用导入严格检查，让声明真正被用到\n    // \"noUncheckedSideEffectImports\": true\n  }\n}\n```\n\n或者用三斜线引用：`/// <reference types=\"@10coding/vite-plugin-jsx-scoped/client\" />`。\n\n> 若项目已引入 `vite/client`，其 `*.scss` 等通配声明也能覆盖到 `demo.scoped.scss`；\n> 本声明文件让**不依赖 vite/client** 的项目同样不再报错，且语义更精确\n> （只声明 `*.scoped.{css,scss,sass,less}`）。\n\n## 触发 scoped 的两种标记\n\n1. 导入命名约定样式文件：`*.scoped.css`、`*.scoped.scss`、`*.scoped.sass`、`*.scoped.less`\n2. JSX 内联标签：`<style scoped>`（lang 缺省按 css）\n\n```tsx\nimport './demo.scoped.scss'\nexport default function Demo() {\n  return (\n    <section className=\"demo\">\n      <span className=\"demo__tip\">ok</span>\n      <style scoped>{`.demo__tip { color: teal; }`}</style>\n    </section>\n  )\n}\n```\n\n## 配置\n\n```ts\ninterface JsxScopedViteOptions {\n  /** 同一组件导入多个 scoped 资源时的覆盖风险警告，默认 true */\n  warnMultiScopedImport?: boolean\n  /** scope hash 位数（md5(组件绝对路径) 截取），默认 8 */\n  scopeHashLength?: number\n  /**\n   * 组件 scoped：默认 true。\n   * 给自定义组件标签注入 <Child scopedId=\"data-v-{hash}\">；\n   * 设为 false 则自定义组件标签不被注入任何属性。\n   */\n  componentScoped?: boolean\n  /** 注入到自定义组件标签上的属性名，默认 'scopedId' */\n  scopedIdAttributeName?: string\n  /** 「变量当标签」marker 属性名，默认 'direct-scoped' */\n  directScopedAttributeName?: string\n}\n```\n\n## 组件 scoped（child-root 继承）\n\n默认开启。自定义组件标签会收到 `scopedId=\"data-v-<parentHash>\"`，子组件\n**按需**自行绑定到根元素，父组件 scoped 样式即可命中子组件根元素\n（等价 Vue scoped 的 child-root 继承父级 scope id）：\n\n```tsx\n// Child.tsx —— 需要继承父级 scope 时手动绑定\nexport default function Child({ scopedId }: { scopedId?: string }) {\n  return <div className=\"child-root\" {...(scopedId ? { [scopedId]: '' } : {})}>…</div>\n}\n```\n\n不需要继承的组件忽略该 prop 即可，零成本。\n\n## 行为与边界\n\n- 同一组件所有 scoped 资源共享同一 `data-v-{hash}`（种子 = 组件文件绝对路径）；\n- **同一份 `*.scoped.*` 文件被多个组件导入 → 构建直接报错**（组件私有资源）；\n- scss/less 里的 `@import` 由编译器内联，内联内容**不会**再被追加 scope\n  （与 Vue scoped 一致）；`css.preprocessorOptions.*.additionalData` 照常生效；\n- 未命中标记的组件完全跳过，源码不被改写；\n- 内联 `<style scoped>` 必须是静态文本；组件热更新时联动刷新对应样式模块。\n\n## 可编程复用（JsxScopedPipeline）\n\n插件的编排逻辑被抽成可实例化的 `JsxScopedPipeline`（Vite 插件内部即用它），\n可脱离 Vite hook 直接复用——典型场景：把「md 页面生成的 TSX 文本」按组件处理，\n`componentFilePath` 直接传 md 绝对路径即可（不要求是真实 JSX 文件，也不会读磁盘）：\n\n```ts\nimport { createJsxScopedPipeline } from '@10coding/vite-plugin-jsx-scoped'\n\nconst pipeline = createJsxScopedPipeline()\n\n// md → TSX 文本（含 <style scoped>）\nconst result = pipeline.transform(tsxText, '/abs/path/page.md')\n// => { enabled, code, map, warnings, scopeAttr, scopeHash, virtualIds }\n\n// 内联样式已在 transform 时登记：load 优先取登记内容，不依赖磁盘\nconst css = await pipeline.load(result.virtualIds[0]) // 已追加 [data-v-{hash}]\n```\n\n要点：\n\n- `transform(code, componentFilePath, parserFilename?)`：md 路径缺省会按 TSX 语法\n  解析；`parserFilename` 可在组件路径与实际语法来源不一致时显式指定；\n- 返回 `warnings: string[]`（多资源覆盖、无法解析的导入、解析失败等提示），\n  绑定 Vite config 时同时写入 `config.logger`，编程式调用方可只消费返回值；\n- 解析失败时 `enabled=false` 且带 `parseError` 字段；\n- `virtualIds` 不含 `\\0` 前缀，可用导出的 `parseVirtualId(id)` 反解成\n  `{ kind: 'file'|'inline', cssRealPath/componentFilePath, index }`；\n- **实例状态即会话状态，存在可共享的 registry 中**：内联样式登记、scoped 文件\n  归属、HMR 失效映射、提示去重统一存放在 `JsxScopedRegistry` 内。请对共享同一\n  registry 的实例传入唯一且稳定的 `componentFilePath`；\n- **跨实例共享（进程级默认单例）**：未显式传 `registry` 且未开 `isolated` 的实例\n  默认共享 `getDefaultJsxScopedRegistry()` 返回的进程级单例，因此「编译管线 A\n  的 `transform` 登记的内联样式」可被「另一插件实例 B 的 `load`」直接读取——这是\n  md→TSX 等生成代码场景下、核心编译管线与站点 Vite 插件分处不同插件上下文时的\n  协作基础：\n  ```ts\n  import {\n    createJsxScopedPipeline,\n    createJsxScopedRegistry,\n  } from '@10coding/vite-plugin-jsx-scoped'\n\n  // A: 编译管线（例如 vitepress md → TSX）\n  const core = createJsxScopedPipeline() // 共享默认单例\n  const { code, virtualIds } = core.transform(tsxText, '/abs/path/page.md')\n\n  // B: 站点 Vite 插件（同一进程内的另一实例）——无需同实例即可 load\n  const site = createJsxScopedPipeline() // 共享同一默认单例\n  const css = await site.load(virtualIds[0])\n  ```\n- **需要隔离时**：传 `registry: createJsxScopedRegistry()`（自建一份全新状态，\n  可与其它实例显式共享同一份），或开 `isolated: true`（本实例独占全新状态，\n  适合并行测试/多份互不干扰的编译）。优先级：`registry` > `isolated` > 默认单例；\n- **会话结束请清理**：registry 持有全部会话状态（文件归属 / HMR 失效映射 /\n  内联登记 / 提示去重），默认不自动清空。Vite 插件只会在 `isolated: true`\n  （本插件独占 registry）时，于 dev server `close` 与单次 build\n  （`closeBundle`，watch 模式除外）后自动 `dispose()`；**默认进程级单例可能\n  与其它实例共享（如 vitepress-react 核心 md 管线），单个插件绝不可擅自清空**\n  ——否则会抹掉其它实例刚 transform 登记的内联样式，导致后续 load 扑空。\n  显式传入 `options.registry` 时生命周期归调用方，插件不自动清理。编程式/测试\n  场景在 teardown 手动调用 `pipeline.registry.reset()`（`dispose()` 是语义别名）。\n  清空后旧虚拟 id 无法 load（得到友好错误）；Map/Set 引用保留，实例可继续复用。\n  注意：仅在没有其它活跃会话共享同一 registry 时清理；\n- 外部的 css 产物若要享受 dev 注入 + HMR + build 抽取，需让产物代码 import 上述\n  `virtualIds`，且本插件在该 Vite 应用中以相同选项注册（`resolveId`/`load`\n  由它提供）。\n\n## 原理速览\n\n组件 transform 阶段把 scoped 导入改写到「虚拟 css 模块」；\n模块 load 阶段：读原始样式 → sass/less/css 编译为普通 CSS →\n`@10coding/postcss-jsx-scoped` 追加 `[data-v-{hash}]` →\n以普通 `.css` 模块交还 Vite css 管线（dev 注入 + HMR、build 抽取产物均由 Vite 完成）。\n\n## 开发\n\n```bash\npnpm --filter @10coding/vite-plugin-jsx-scoped build\npnpm demo   # 仓库根目录启动 React 示例\n```\n\nLicense: MIT\n","readmeFilename":""}