{"_id":"@amriogit/injector","_rev":"3-dafbaf52170ddef1d088f1af9d3a1514","name":"@amriogit/injector","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@amriogit/injector","version":"0.1.0","keywords":["di","dependency-injection","injector","typescript","vue","ssr"],"license":"MIT","_id":"@amriogit/injector@0.1.0","maintainers":[{"name":"amrio","email":"amriogm@gmail.com"}],"homepage":"https://github.com/amriogit/injector#readme","bugs":{"url":"https://github.com/amriogit/injector/issues"},"dist":{"shasum":"e1074568b026c4eda0754e1c70def60552a0e3c9","tarball":"https://registry.npmjs.org/@amriogit/injector/-/injector-0.1.0.tgz","fileCount":7,"integrity":"sha512-ttQU59fjwhPUJeKEpPoNLpEIVZpvrLzQfO3JiC0JdpqVo1DqfzpTkoAbqkfl3ouY7oVsYzLAlxBUNFIkQHy9OQ==","signatures":[{"sig":"MEUCIEim9tDfvevCNBwkp2i7Wpo6tHcXBsSoTrqnX+Q6262oAiEAqUjhHgx5xtoDE1k9ZDvCTxttqtpBwn7hxwn++eR5cY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16237},"main":"./dist/injector.js","type":"module","types":"./dist/injector.d.ts","exports":{".":"./dist/injector.js","./vue":"./dist/injector-vue.js"},"gitHead":"f567436fbc250e447f8052ec2ebc07094e73c587","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"amrio","email":"amriogm@gmail.com"},"repository":{"url":"git+https://github.com/amriogit/injector.git","type":"git"},"_npmVersion":"11.9.0","description":"轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖，支持 SSR，Vue 集成。","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.34","vitest":"^3.2.4","typescript":"^5.8.3"},"peerDependencies":{"vue":"^3.4.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/injector_0.1.0_1781055980442_0.3037500337537351","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@amriogit/injector","version":"0.2.0","keywords":["di","dependency-injection","injector","typescript","vue","ssr"],"license":"MIT","_id":"@amriogit/injector@0.2.0","maintainers":[{"name":"amrio","email":"amriogm@gmail.com"}],"homepage":"https://github.com/amriogit/injector#readme","bugs":{"url":"https://github.com/amriogit/injector/issues"},"dist":{"shasum":"829d073be6d04eb78324e99b0b46b9830a84e112","tarball":"https://registry.npmjs.org/@amriogit/injector/-/injector-0.2.0.tgz","fileCount":7,"integrity":"sha512-eTCP32hggl4PlZxYx79JjTl5yVAL/hIZX33hmAk9vnhJwan4eYKJ3lMnojK2MPzNewFL2uzvkWOw54i2KcSQfA==","signatures":[{"sig":"MEYCIQCSRv7wtXnJ74wbF+JwgzYwrjoogD+/L9/bru70GIahYQIhAKIp7bZjd/083twj+oasMy1KvILG56/a5PjlxVrO283Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18281},"main":"./dist/injector.js","type":"module","types":"./dist/injector.d.ts","exports":{".":"./dist/injector.js","./vue":"./dist/injector-vue.js"},"gitHead":"99118bfa2a026774a374a4d4678e79b7aa4c76a3","scripts":{"test":"vitest run","build":"tsc","test:watch":"vitest","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"amrio","email":"amriogm@gmail.com"},"repository":{"url":"git+https://github.com/amriogit/injector.git","type":"git"},"_npmVersion":"11.9.0","description":"轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖，支持 SSR，Vue 集成。","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.34","vitest":"^3.2.4","typescript":"^5.8.3"},"peerDependencies":{"vue":"^3.4.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/injector_0.2.0_1781057717785_0.7208781136860023","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@amriogit/injector","version":"0.3.0","type":"module","description":"轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖，支持 SSR，Vue 集成。","keywords":["di","dependency-injection","injector","typescript","vue","ssr"],"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/amriogit/injector.git"},"bugs":{"url":"https://github.com/amriogit/injector/issues"},"homepage":"https://github.com/amriogit/injector#readme","main":"./dist/injector.js","types":"./dist/injector.d.ts","exports":{".":"./dist/injector.js","./vue":"./dist/injector-vue.js","./vue2":"./dist/injector-vue2.js"},"publishConfig":{"access":"public"},"peerDependencies":{"vue":"^2.6.0 || ^3.4.0"},"peerDependenciesMeta":{"vue":{"optional":true}},"scripts":{"build":"tsc","test":"vitest run","test:watch":"vitest","prepublishOnly":"npm test && npm run build"},"devDependencies":{"@types/vue":"^2.0.0","typescript":"^5.8.3","vitest":"^3.2.4","vue":"^3.5.34"},"license":"MIT","gitHead":"ad5d7801b4eb874439d6cfdaa658ce0b39e23498","_id":"@amriogit/injector@0.3.0","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-j3l73Db/251wat2Y6KDGnO2+PXN7SjSR2LldudmPFigs8SNAmzmNiEOf7R3Y9SpP73xZglAY/neWAdZI9u4wZg==","shasum":"c885f97d2aa1e3d26da5368f000b9500a765a5ba","tarball":"https://registry.npmjs.org/@amriogit/injector/-/injector-0.3.0.tgz","fileCount":9,"unpackedSize":25737,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDkpkhIJle2t9OmFfeE2QlQvlRB6F2EyD+CXl8WIcCU1AiBSqMeCtX8XRc515CjOE+D9yDNhgrBCgTkg9+hV6gQhSw=="}]},"_npmUser":{"name":"amrio","email":"amriogm@gmail.com"},"directories":{},"maintainers":[{"name":"amrio","email":"amriogm@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/injector_0.3.0_1781072430230_0.9398271994679661"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-10T01:46:20.270Z","modified":"2026-06-10T06:20:30.540Z","0.1.0":"2026-06-10T01:46:20.603Z","0.2.0":"2026-06-10T02:15:17.924Z","0.3.0":"2026-06-10T06:20:30.405Z"},"bugs":{"url":"https://github.com/amriogit/injector/issues"},"license":"MIT","homepage":"https://github.com/amriogit/injector#readme","keywords":["di","dependency-injection","injector","typescript","vue","ssr"],"repository":{"type":"git","url":"git+https://github.com/amriogit/injector.git"},"description":"轻量 DI 容器 — Injector, BaseService, InjectionToken。零外部依赖，支持 SSR，Vue 集成。","maintainers":[{"name":"amrio","email":"amriogm@gmail.com"}],"readme":"# @amriogit/injector\r\n\r\n轻量 DI（依赖注入）容器。零外部依赖，可在 Node.js、浏览器、SSR 中运行。\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @amriogit/injector\r\n```\r\n\r\n## 使用\r\n\r\n### 核心 DI\r\n\r\n```ts\r\nimport { Injector, BaseService, InjectionToken } from '@amriogit/injector'\r\n\r\n// 定义 Service\r\nclass Logger extends BaseService {\r\n  log = (msg: string) => console.log(msg)\r\n}\r\n\r\nclass UserService extends BaseService {\r\n  private logger = this.$inject(Logger)  // 声明依赖\r\n  private db = this.$inject(DB_POOL)     // InjectionToken 也支持\r\n\r\n  state = reactive({ users: [] as User[] })\r\n\r\n  onInit() {\r\n    // 依赖已就绪，做初始化\r\n  }\r\n\r\n  fetchUsers = async () => { /* ... */ }\r\n}\r\n\r\n// 创建容器\r\nconst injector = new Injector()\r\n\r\n// 覆写实现\r\ninjector.provide(Logger, MockLogger)\r\n\r\n// 获取实例（自动实例化 + 单例）\r\nconst userService = injector.inject(UserService)\r\n```\r\n\r\n### Vue 3 集成\r\n\r\n```ts\r\nimport { createApp } from 'vue'\r\nimport { ServicePlugin, useInject, useProvide } from '@amriogit/injector/vue'\r\n\r\n// 安装插件\r\ncreateApp(App)\r\n  .use(ServicePlugin)\r\n  .mount('#app')\r\n\r\n// 组件中注入 Service\r\nconst userService = useInject(UserService)\r\n\r\n// 为子树覆写实现\r\nuseProvide(UserService, MockUserService)\r\n```\r\n\r\n### Vue 2 集成\r\n\r\n```ts\r\nimport Vue from 'vue'\r\nimport { ServicePlugin, mapInject } from '@amriogit/injector/vue2'\r\n\r\n// 安装插件\r\nVue.use(ServicePlugin, {\r\n  setup(injector) {\r\n    injector.provide(API_BASE, '/api')\r\n  },\r\n})\r\n\r\n// 使用 mapInject 在 computed 中批量声明依赖\r\nexport default {\r\n  computed: {\r\n    ...mapInject({ UserService, ChannelService }),\r\n  },\r\n  created() {\r\n    this.userService.fetchUsers()\r\n    this.channelService.load()\r\n  },\r\n}\r\n```\r\n\r\n#### Vue 2 注意事项\r\n\r\n1. **推荐 `mapInject`**：批量声明、自动 camelCase 转换、类型安全\r\n2. **无额外依赖**：不依赖 Composition API，Vue 2.0+ 通用\r\n3. **自动清理**：根组件销毁时自动调用 `injector.reset()`，触发所有 Service 的 `onDestroy` 钩子\r\n\r\n## 特性\r\n\r\n- **零依赖** — 纯 TypeScript，无运行时依赖\r\n- **无全局单例** — 每个应用/请求创建独立 Injector\r\n- **自动实例化** — 类 token 首次 `inject()` 时自动创建，无需手动注册\r\n- **类型安全** — `provide()` 函数重载在编译期防止错误的实现类型\r\n- **InjectionToken** — 为非类注入（配置、缓存等）提供类型安全\r\n- **生命周期** — `onInit()` 钩子在依赖就绪后调用\r\n- **SSR 兼容** — 无 DOM 依赖，InjectionToken 可序列化\r\n\r\n## 生命周期\r\n\r\n### onInit — 初始化\r\n\r\n`onInit()` 在 Service 构造完成、所有 `$inject()` 依赖就绪后自动调用。不要在构造函数中做初始化逻辑。\r\n\r\n```ts\r\nimport { BaseService } from '@amriogit/injector'\r\n\r\nclass TimerService extends BaseService {\r\n  private logger = this.$inject(LoggerService)\r\n  private intervalId?: ReturnType<typeof setInterval>\r\n\r\n  state = reactive({ ticks: 0 })\r\n\r\n  onInit() {\r\n    // 依赖已就绪，可以安全使用 this.logger\r\n    this.intervalId = setInterval(() => {\r\n      this.state.ticks++\r\n      this.logger.log(`tick ${this.state.ticks}`)\r\n    }, 1000)\r\n  }\r\n}\r\n```\r\n\r\n### onDestroy — 清理\r\n\r\n`onDestroy()` 在 Service 被销毁时调用，用于清理定时器、取消订阅、关闭连接等。\r\n\r\n触发方式：\r\n\r\n- **`injector.destroy(Token)`** — 销毁指定 Service 实例\r\n- **`injector.reset()`** — 销毁所有 Service 实例\r\n\r\n```ts\r\nimport { BaseService, Injector, InjectionToken } from '@amriogit/injector'\r\n\r\n// WebSocket 连接示例\r\nclass ConnectionService extends BaseService {\r\n  private ws?: WebSocket\r\n\r\n  connect = (url: string) => {\r\n    this.ws = new WebSocket(url)\r\n  }\r\n\r\n  onDestroy() {\r\n    this.ws?.close()\r\n    this.ws = undefined\r\n  }\r\n}\r\n\r\n// 定时器清理示例\r\nclass PollingService extends BaseService {\r\n  private timer?: ReturnType<typeof setInterval>\r\n\r\n  onInit() {\r\n    this.timer = setInterval(() => this.poll(), 5000)\r\n  }\r\n\r\n  private poll = () => { /* ... */ }\r\n\r\n  onDestroy() {\r\n    clearInterval(this.timer)\r\n  }\r\n}\r\n\r\nconst injector = new Injector()\r\n\r\nconst polling = injector.inject(PollingService)\r\n\r\n// 需要替换实现时，先销毁旧实例\r\ninjector.destroy(PollingService)\r\n// polling.onDestroy() 已调用，定时器已清理\r\n// 下次 inject(PollingService) 返回新实例\r\n\r\n// 或者一次性清理所有\r\ninjector.reset()\r\n```\r\n\r\n`onDestroy` 与 `onInit` 配对使用，确保 Service 的资源生命周期可管理，防止内存泄漏。\r\n\r\n## 测试\r\n\r\n```bash\r\nnpm test\r\n```\r\n","readmeFilename":"README.md"}