UNPKG

vkitty

Version:
157 lines (147 loc) 5.14 kB
# 技术方案 ## 数据模型 ```JavaScript var actionFiles = [ { file: "/Users/mebx/git/fudongguang/v-kitty/test/index.html", ext:".index.html", cdnUrl:"https://si.geili.cn/ffs2i2n121n112o90811.js",//cdn地址, name:"./index.html", destFile:"",//build后生成的文件 mtime:"xxxx-xx-xx",//最后修改时间 content:"xxxx",//文件源码 图片没有 compile:"",//编译后的内容 图片没有 isNew:false,//默认是true, param:"", options: { cdn: "@@cdn@@/index", title: "猜你喜欢" }, actionFiles: [ { content: "a11111111" }, { file: "/Users/mebx/git/fudongguang/v-kitty/test/index.js", ext:".index.js", cdnUrl:"https://si.geili.cn/ffs2i2n121n112o90811.js?v=123&a=123",//cdn地址, param:"?v=123&a=123", name:"./index.js", destFile:"",//build后生成的文件 mtime:"xxxx-xx-xx",//最后修改时间 content:"xxxx",//文件源码 图片没有 compile:"xxxx",//编译后的内容 图片没有 isNew:true, actionFiles:[ { content:"a222222" }, { file:"/Users/mebx/git/fudongguang/v-kitty/test/index.less", ext:".index.less", cdnUrl:"https://si.geili.cn/ffs2i2n121n112o90811.css",//cdn地址 param:"", name:"./index.less", destFile:"",//build后生成的文件 mtime:"xxxx-xx-xx",//最后修改时间 content:"xxxx",//文件源码 图片没有 compile:"xxxx",//编译后的内容 图片没有 actionFiles: [content,file,file,content], //最后一定是 [content] isNew:false, option:{ cdn: "@@cdn@@/index", title: "猜你喜欢" }, loaders:["less","minify"] }, { content:"b222222" } ], loaders:["bable","minify"] }, { file: "b111111" } ] } ]; //require不能有options,同事 require的 loaders只能是['_require'] ``` ## 模型数据介绍 ```JavaScript var actionFiles = { "/Users/mebx/git/fudongguang/v-kitty/test/index.js":{ file:"/Users/mebx/git/fudongguang/v-kitty/test/index.js",//文件名称 cdnUrl:"https://si.geili.cn/ffs2i2n121n112o90811.js",//cdn地址, destFile:"",//build后生成的文件 mtime:"xxxx-xx-xx",//最后修改时间 content:"xxxx",//文件源码,原始状态 图片没有 compile:"xxxx",//编译后的内容 图片没有 options: { cdn: "@@cdn@@/index", //cdn是保留字,不能用在自定义变量上面 title: "猜你喜欢" //自定变量title }, actionFiles:[ { content: "a11111111" }, { actionfiles } { content: "b11111111" }, ] } }; ``` ## 整体技术方案 1. 解析文件,每次都生成新的模型数据 2. 解析单个文件时,发现mtime没有变更(如果mtime变更,但是content没有变),assign老的文件模型数据,并进行isNew=false打标. 3. 对isNew打标的数据进行判断,然后冒泡处理变动的文件,用loaders来编译数据. ## cdn处理方案 1. config.cdnUrl //cdn地址设定 用以替换 @@cdn@@ 2. 如果_include选项中没有不是以文件名结尾,那么在后面增加hash文件名 ```javascript _include(cdn('./a.js'),{"cdn":"@@cdn@@/index"}) ``` ## 配置 ```JavaScript var config = { cache:true,//是否开启缓存,默认开启,加速编译 tag:'_include',//引入tag baseDir:__dirname.replace(/\/node_modules.*$/,''),//项目根目录 cdnUrl:"https://baidu.com",//cdn地址路径 varTag:{ open:'@@',//变量开始符 close:"@@"//变量结束符 } }; ``` ## require 方案 1. require的代码自动执行 2. 代码执行require要方便处理 3. 执行后要返回module.exports ### 数据模型 ```JavaScript //执行模型 (function(modules){ function _kitty_require(moduleId){ var module = { exports:{}, id:moduleId }; modules[moduleId].call(module.exports,module,_kitty_require); return module.exports; } return _kitty_require(0); })([module,module]); ``` ```javascript //module模型数据 同主数据模型,增加了下面模型数据 actionFile.mid=111; //同时 actionFile.loaders=['_require'] 不能自定义设置 ``` ## 错误追踪 console.log(actionFile.file)