{"id":13671820,"url":"https://github.com/janryWang/kvm","last_synced_at":"2025-04-27T18:31:45.766Z","repository":{"id":28207942,"uuid":"31711665","full_name":"janryWang/kvm","owner":"janryWang","description":"KVM.js 轻量级模块管理器，依赖注入，AMD，Commonjs规范,Promise化","archived":false,"fork":false,"pushed_at":"2018-06-29T14:18:39.000Z","size":2828,"stargazers_count":41,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-22T22:37:26.283Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/janryWang/kvm","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/janryWang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-03-05T11:56:52.000Z","updated_at":"2023-02-25T13:03:59.000Z","dependencies_parsed_at":"2022-08-03T04:45:30.668Z","dependency_job_id":null,"html_url":"https://github.com/janryWang/kvm","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janryWang%2Fkvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janryWang%2Fkvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janryWang%2Fkvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/janryWang%2Fkvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/janryWang","download_url":"https://codeload.github.com/janryWang/kvm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251187295,"owners_count":21549616,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T09:01:19.580Z","updated_at":"2025-04-27T18:31:43.694Z","avatar_url":"https://github.com/janryWang.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"\u003cimg src=\"https://raw.githubusercontent.com/janryWang/kvm/master/logo.png\" width=\"499\" height=\"260\" alt=\"KVM.js 模块管理器(v0.0.3)\"\u003e\n\nKVM.js 模块管理器(v0.2.0),带给你不一样的模块管理体验\n\n支持AMD,CMD规范，支持依赖注入，支持插件式加载脚本\n\n\u003e如果你需要做一个浏览器书签，或者chrome插件，或者第三方组件，对于嵌入到对方网站上的情况，\n\u003e你不能保证对方是否已经存在有你所依赖的相关库，这样就可能存在浪费资源的情况，所以我添加了冲突检测机制\n\u003e使得该加载器更加智能化\n\n#bower安装\n\n```\nbower install kvm\n```\n\n \n#更新日志\n\nv0.2.0\n===\n* 修复commonjs在safari下的性能问题\n* ES6重构，兼容至IE9\n* 将插件全部作为独立包\n* 支持在路径中直接添加querystring或者hashstring来作为版本迭代指令或者第三方插件指令\n\nv0.1.5\n===\n* 重构，将内部模块解耦,以Promise为核心，可通过模块返回Promise对象来延迟加载依赖\n* 依赖可以依赖css，在querystring中使用media=\"xxxx\"可以控制响应式样式表范围\n* 添加了插件模式，可以随意的给kvm添加各种插件\n\nv0.1.0\n===\n\n* 已做添加包管理机制\n* 已添加cmd规范支持\n* 性能提升，实测为requirejs的2倍多\n* 因为维护时间有限，已经放弃mini版本的维护，非常抱歉.\n\n\n#API接口\n\nKVM.module\n\n * KVM.module.define 定义模块,这里，全局define也可以定义模块\n    \n```\n    define([dep1,dep2,....],function(dep1,dep2,...){ //定义匿名模块\n      \n    })\n    define([dep1,dep2,....,function(dep1,dep2,...){ //定义匿名模块,angular风格\n      \n    }])\n    define(function(){ //定义匿名模块,无依赖\n      \n    })\n    define([\"require\",\"exports\",\"module\"],function(require,exports,module){//commonjs风格\n        var depA = require(\"depA\");\n\n        module.exports = function(){\n           return depA.fun();\n        };\n\n        or\n\n        exports.fun = function(){\n            return depA.fun();\n        };\n    })\n    定义id模块，id就是模块路径\n    define(id,后面的和匿名定义模块一样)\n    \n    定义注入的依赖\n    \n    define(id,deps,facotry,injectors)\n\n    injectors的规范：\n        {\n          module_id:[dep1,dep2,dep3,...,fucntion(dep1,dep2,dep3){//这里可以是数组也可以是函数，随便你怎样搞\n\n          }]\n        }\n    \n```\n\n * KVM.module.invoke 调用模块\n \n```\n    KVM.module.invoke('{module id}',injectors) //调用模块，可以指定模块路径，injectors是临时注入的依赖，同时它也能依赖其他模块\n    KVM.module.invoke([dep1,dep2,...,function(dep1,dep2,...){ //调用匿名模块，通常用于临时将某些依赖合并使用\n    \n    }],injectors);\n\n    injectors的规范：\n    {\n      module_id:[dep1,dep2,dep3,...,fucntion(dep1,dep2,dep3){//这里可以是数组也可以是函数，随便你怎样搞\n      \n      }]\n    }\n    \n    invoke调用后返回的结果是一个promise对象，所以通过then可以获得模块的实例\n    \n```\n\n * KVM.module.use 使用某一模块，功能单一，没有注入依赖的功能\n \n```\n    KVM.module.use('id',function(instance){//仅仅只能使用id来调用，不能像invoke一样调用一个匿名工厂\n    \n    });\n    \n```\n \n * KVM.module.config 参数配置\n \n```\n  KVM.module.config(options);\n  \n  options = {\n     baseUrl:\"\",//项目基础路径，这个对于按需加载应用来说是必须要配置\n     shims:{//模块包装器，主要是为了兼容第三方模块\n        angular:{\n           url:\"\",\n           facotry:[deps,function(){//这里定义facotry可以是数组也可以是函数，随便你怎样搞\n              return angular\n           }],\n           exports:\"$\"//该字段针对于注入到全局作用域的第三方组件的组件名，可以用其替代factory，也能自动检测冲突，比如该例子，如果$存在于全局域中，系统就不会再请求脚本了\n        }\n     },\n     vars:{\n        mod:\"./modules\",\n        hello:\"{mod}/hello\"//变量中可以互相重用\n     },\n     alias:{//路径别名，就是为了懒人准备的\n        player:\"{mod}/Player\"//这样映射后每次依赖的时候就不需要每次都使用长长的路径id了,同时还支持别名路径的重用,通过使用{}语法来链接vars中的属性\n     },\n     packages:{//包管理机制\n        packageName:{\n            url:\"\"//包路径\n        }\n     }\n  }\n```\n \n * KVM.module.data 返回当前配置\n \n```\n  KVM.module.data(name);如果name为空返回所有配置，如果name不为空则返回相应的配置项\n  \n```\n\nKVM.isArray 判断是否是数组\n \n\nKVM.isString 判断是否是字符串\n\n\nKVM.isObject 判断是否是对象，这个对象不包括数组\n\n\nKVM.isFunction 判断是否是函数\n\n\nKVM.isBoolean 判断是否是布尔值\n\n\nKVM.isReference 判断是否是引用类型\n\n\nKVM.isValue 判断是否是值类型\n\n\nKVM.isEmpty 判断对象是否为空，可以判断数组也可以判断对象\n\n\n###内置模块接口\n\n\n####$emitter 事件分发器\n\n```\nvar event = new $emitter(cache/*外部缓存事件队列*/);\n\nevent.$on(“eventName”,callback) 注册事件\n\nevent.$emit(\"eventName\",param1,param2,....) 触发事件\n\nevent.$remove(\"eventName\",callback) 删除事件\n\nevent.$one(\"eventName\",callback) 注册事件，对于一个事件名只能注册一个事件处理器\n\n```\n\n###插件接口\n\n```\n\nkvm.module.registerPlugin(function(interface){\n    ....\n});\n\n这是相关暴露出来的插件接口\n\nlet PluginInterface = {\n\tregisterModuleParser: Module.registerModuleParser,//用于模块解析，参造commonjs插件\n\n\tregisterDriverLoader: Driver.registerDriverLoader,//用于各种加载驱动程序\n\tregisterDriverLoaded: Driver.registerDriverLoaded,//驱动加载后的回调\n\tregisterDriverBeforeLoad: Driver.registerDriverBeforeLoad,//驱动加载前的回调\n\n\tregisterFileExtParser: Path.registerFileExtParser,//文件后缀解析器\n\tregisterPathParser: Path.registerPathParser,//路径解析器\n\tregisterPathMaper: Path.registerPathMaper,//路径映射解析器\n\n\tcreateModule: Module.createModule,//创建一个模块\n\tcreatePath: Path.createPath//创建一个path\n};\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FjanryWang%2Fkvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FjanryWang%2Fkvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FjanryWang%2Fkvm/lists"}