Skip to content
Browse files

很早之前没有提交的修改+readme开发中

  • Loading branch information...
1 parent 7e2f380 commit 0da8a6ceb4e286c9bd1ad612ee568504187facce jicheng.li committed Dec 25, 2012
Showing with 90 additions and 110 deletions.
  1. +2 −88 index.js
  2. +61 −3 readme.md
  3. +10 −3 register.js
  4. +3 −3 resolver.js
  5. +14 −4 segment.js
  6. +0 −9 test/entry.js
View
90 index.js
@@ -22,7 +22,7 @@ var Register = require('./register.js');
//记录所有bundles列表
//维护所有依赖关系树各节点的详细信息
//提供判断某节点寄存是否失效的方法
-//TODO: 第一个版本的BigMap暂时只做Registor的一层便利封装,不提供树节点智能判断的功能
+//TODO: 第一个版本的BigMap暂时只做Register的一层便利封装,不提供树节点智能判断的功能
//基于文件mtime时间判断
var BigMap = function(registor){
var self = this;
@@ -392,6 +392,7 @@ Combine.prototype = {
var bigmap = this.getopt('bigmap');
var key;
if(force || !(key = bigmap.isUp2date(this.id)) ){
+ force = true; //只要有一个模块被更改了,全部强制重新编译(为了重新计算依赖信息)
this.entry = this.newSegment(this.id, force);
//重新打包被改动过的模块
var errors = this.collect(force);
@@ -457,43 +458,7 @@ var options = {
'tpl': '../tpl_build'
}
};
-var virtuals = {
- 'buddy.tpl.js': [
- 'tpl::buddy/aBuddy.html',
- 'tpl::buddy/groups.html',
- 'tpl::buddy/win.html',
- 'tpl::buddy/lis.html',
- 'tpl::buddy/friendListInner.html',
- 'tpl::buddy/noResult.html'
- ],
- 'ugc-topics.js': [
- 'ugc/common',
- 'ugc/photo',
- 'ugc/video'
- ]
-};
-//运行时存储所有工程相关资源
-var projects = {};
-//工程相关信息
-var Project = function(opts){
- this.srcdir = path.join( opts.root, opts.src );
- var registor = this.registor = new Register(opts.root);
- this.bigmap = new BigMap(registor);
- this.resolver = new Resolver(this.srcdir, opts.domains, ['index.js']);
- //var publist =
-};
-var getProject = function(opts){
- var pj;
- if( pj = projects[opts.root] ){
- return pj;
- }else{
- //计算和准备相关资源
- pj = new Project(opts);
- projects[opts.root] = pj;
- return pj;
- }
-};
//@param request{path} 请求,publist中的某个文件,不带/开头是id, 带/开头是完整文件路径
exports.bundle = function(request, options, force){
console.log(' Comming ... ', request);
@@ -531,13 +496,6 @@ exports.build = function(options, target){
//按列表指定,挨个创建bundle,发布文件到target
};
-//由pages的引用生成发布文件列表
-//exports.mapout = function(){
-//
-//};
-
-
-
//打包一个文件
//@param entry{path} 文件的访问路径,需要resolver解释解释一下; 目标文件的完整路径/相对pkgroot的相对路径(不能以/号开头)
//
@@ -549,50 +507,6 @@ exports.build = function(options, target){
//};
-//发布文件列表
-var publist = [
- {
- path: 'im.js' //默认是CommonJS模块打包
- //对tpl的引用暂时忽略不打包
- },
- {
- path: 'channel.js',
- },
- {
- path: 'ugc-topics.js',
- include: ['ugc/common', 'ugc/photo', 'ugc/video']
- },
- {
- path: 'buddy.tpl.js',
- include: ['tpl::buddy_win', 'tpl::buddy_groups', 'tpl::aBuddy', 'tpl::buddyLis', 'tpl::noResult' ]
- }
-];
-
-//如果是直接运行的,接收命令行参数
-if( require.main === module ){
- var argv = process.argv;
- var fullpath = fs.realpathSync(path.resolve( argv[2] ));
- //var output = argv[3];
-
- if( !path.existsSync( fullpath ) ){
- console.log('指定入口文件不存在');
- process.exit(1);
- }
-
-
- var entry = path.relative( path.join( fs.realpathSync(options.root), options.src), fullpath );
- var bundled = exports.bundle(entry, options); //, null, ['tpl::buddy/aBuddy.html.js', 'tpl::buddy/buddy_groups.html.js']);
- fs.writeFileSync('/Users/Lijicheng/htdocs/xn.static/webpager/im.js', bundled);
-}
-
-
-//var pkg = findRoot(fullpath);
-//if(!pkg){
-// console.log('在指定路径中没找到publist');
-// process.exit(1);
-//}
-//console.log('PKG: ', pkg);
-
//var tool_root = __dirname; //被执行的这个脚本所在目录
//取得模块的root
View
64 readme.md
@@ -1,4 +1,31 @@
+开发中。。。
+==========
+两年前的冬天,下班回家的地铁上就在思考怎样维护JS中烦人的HTML片段。再后来烦人的事儿越来越多,终于这个夏天花了些时间开始搞这个Dobby,希望他能像小精灵一样让所有复杂的事情一下子变简单。
+
+现在只是个雏形,现在搞到Github上是为了防止再一次石沉大海。
+
+主要解决的问题:
+
+* 模板文件的管理,提供一种简便的方式在JS中引用模板。
+* CSS文件分片,与相关的模板片段放到一起,方便维护。
+* 一个UI模块包含所有的源代码(HTML模板、CSS、JS交互逻辑)
+* require风格的依赖关系管理
+* 在页面中提供一种新的引用静态文件方式,经过dobby处理后会替换成真实发布路径。
+
+目前已经完成:
+
+* require依赖关系的计算
+* 源文件的简单预处理
+* 自动计算合并方案
+
+---------------- 以下内容请忽略 -------------------
+
+-------------------------------------------------
+
使用方法
+=======
+dproxy使用require分支,配置文件使用最新的/pages/imf.htm
+dproxy的build模块指定到本地工程路径
指定一个文件,console.log编译后的内容
@@ -52,9 +79,6 @@ bundle的结果保存到 ./src/im/index.js -> .build/im.js
上一次生成的依赖列表中如果没有任何编辑操作,直接返回bundle的文件;
如果有任何一个被编辑了, 重新计算依赖, 保存新的依赖树
-每个寄存文件有效的判断,只要比较修改时间就可以
-为了实现bundled的寄存,需要同时保存由entry开始的所有涉及到的模块的列表,所有的模块都没变才能断定bundled也不变
-
考虑Dproxy调用的时候参数
重新设计register,对segment和index抽象 文件路径名 不负责解析内容
@@ -119,6 +143,40 @@ nodejs工程下用package.json描述的工程只有js和其他逻辑代码,不
整个系统基于一个简单的想法: 源文件任意组织,发布文件生成的过程就是从pages某个页面依赖的众多模块和UI绘制列表中,逐个处理提取并编译出浏览器能够执行的js,css片段,合并成为发布文件.
+请求某个文件的过程:
+---------------
+找到对应的工程
+加载发布方案
+发布的文件暂时只有两种: css , js ; 将来可能有 png gif font ejs…
+
+整个方案是以JS为起始逻辑的思想设计的. 所有其他文件全部都是js程序引用的资源.
+如果css未指定发布文件名,与js同名,与js相同的加载方式(load/lazy).
+
+寄存的时机:
+---------
+工程的配置文件是全局的依赖,被修改后整个工程需要重新编译.
+最终发布文件需要寄存.
+考虑编辑某个源文件,重新处理ore编译的次数,各ore.segments的编译结果暂时不需要寄存.
+
+segments编译结果寄存的方式: 同一个文件? 分开存储?
+
+寄存的实现策略:
+-------------
+
+主要话题:
+
+寄存形式: 唯一标识 + 内容 + 关联的源文件(失效条件)
+标识 -> 路径
+内容 -> 字符串
+元信息 -> 源文件路径,修改时间
+
+寄存有效的条件: 元信息格式正确,源文件存在(如果有指定源文件),源文件修改时间早于寄存的修改时间
+问题: 是否可以指定多个源文件? 暂时不加,对于业务逻辑证明有稳定需求之后再加到库中.
+
+为了实现bundled的寄存,需要同时保存由entry开始的所有涉及到的模块的列表,所有的模块都没变才能断定bundled也不变
+
+寄存文件命名: 连接符 # ,同一个源文件的多个segments单独存储 通过#连接成文件名
+
计算列表的策略:
-------------
以页面为单位规划模块的发布方案,多个页面公用的发布方案描述可以通过pages文件引用(类似inc文件)实现
View
13 register.js
@@ -13,11 +13,17 @@ var path = require('path');
//把root目录开辟成一块寄存区
var Register = function(root) {
if (!path.existsSync(root)) {
- throw new Error('Pkg root directory not exist!');
+ throw new Error('Pkg root directory not exist! '+ root);
}
- this.dir = path.join(root, '.build'); //path.join(root, BuildDIR);
+ //this.dir = path.join(root, '.build'); //path.join(root, BuildDIR);
+ this.dir = root;
};
+//return regfile =
+//{
+// info: {},
+// content: string...
+//}
//设置某个寄存文件的内容
Register.prototype.replace = function(key, content, postfix, extname){
if(postfix){
@@ -113,7 +119,6 @@ function overwrite(filepath, content){
module.exports = Register;
-
//监视文件改动
//根据查询时间/传入的时间 判断指定的文件是否有改动
//监视所有被关注文件的改动
@@ -165,3 +170,5 @@ var WatchFiles = exports.WatchFiles = {
});
}
};
+
+
View
6 resolver.js
@@ -9,15 +9,15 @@ var fs = require('fs');
//@param domains{k-v} 域声明
var Resolver = function(srcdir, domains, index){
this.srcdir = srcdir;
- this.domains = domains;
- this.index = index; // 指定的是目录 找什么样的问题代替 index.js index.incs
+ this.domains = domains || {};
+ this.index = index || []; // 指定的是目录 找什么样的问题代替 index.js index.incs
};
//从当前目录按照指定ref引用,定位到那个模块
//@param basedir{path} 当前所在完整路径
//@param ref{string} 引用require()
Resolver.prototype.resolve = function(ref, basedir){
-console.log('resolveing .. ', ref);
+console.log3('resolveing .. ', ref);
var domain = null, //::号前面的一个单词
//ref = m, //引用字串 ../shared/jqtpl.js
id, //被引用模块的统一标识 shared/jqtpl.js
View
18 segment.js
@@ -1,12 +1,22 @@
/*
* 模块封装类
*/
-var fs = require('fs');
-var path = require('path');
-var RegExp_require = /require\(('|")(.*?)\1\)/g;
-//var Split_string = '\nalert("Deps Info JSON above, Source Code below.")\n';
+var Segment = function(statement, code){
+ this.name = 'friendbook.tmplate#abuddy.jqtpl'; //identify a uniq segment in a project, also used as id regsiter.
+ this.workflow = ['less', '']; //从源代码到编译结果,需要经过的流程, 顺序调用workman处理代码
+ this.workstatement = '#segmentname.tmp workman:inline,...'; //可以在segment声明行中指定一些附加的workman,这些workman会在扩展名(extname)关联的workman处理之后被调用
+ this.code = code;
+};
+
+Segment.prototype = {
+ compile: function(){
+
+ }
+};
+
+var RegExp_require = /require\(('|")(.*?)\1\)/g;
//Segment原型类
var Segment = function(id, src){
console.log('\nParsing : ', id);
View
9 test/entry.js
@@ -1,9 +0,0 @@
-var base = require('../lib/base');
-var friendbook = require('../service/friendbook');//model
-var service = require('../service');
-var tools = require('../lib/tools');
-var buddywin = require('./buddywin');//view
-var channel = require('../lib/channel_api');
-var dom = base.dom;
-var events = base.events;
-

0 comments on commit 0da8a6c

Please sign in to comment.
Something went wrong with that request. Please try again.