CommonJS调研
标签 » ASP JavaScript 创建时间 » 2011-09-15 15:52:19 评论

CommonJS是什么

CommonJS是一个标准库,或者说是一组规范。因为官方并没有给出真正的代码实现,而是给出一些代码组织规范、常用模块的api、包(Package)的命名规范和具体格式。

CommonJS的官方网站是http://www.commonjs.org/
wiki地址http://wiki.commonjs.org/wiki/CommonJS

Modules

模块的规范,其实就是require方法,定义了如何在当前的代码中使用已有的api。具体的规范(Modules/1.1.1)见http://wiki.commonjs.org/wiki/Modules/1.1.1

约定

Require

  • require是一个函数,接受一个外部模块名称的参数

    • 该方法返回对应外部模块返回的api
    • 如果引入外部模块出错,需要抛出异常
    • require函数可能有一个main属性,只读
    • require函数可能有一个paths属性,一个字符串数组,定义了查找引入模块的优先级。
  • 模块上下文

    • 一个模块中,有一个变量require
    • 一个模块中,有一个对象exports,包含这个模块对外的api
    • 一个模块中,还必须有一个变量module,是一个对象,可能包含iduri属性。
  • 模块名

    • 模块名是由斜杠连接的1个或多个term组成的字符串
    • term必须驼峰命名,也可能是. ..
    • 模块名可以没有后缀名.js
    • 模块名可以是相对路径或默认"顶级"的,如果是相对路径必须在前面加上'.'或'..'

使用示例

math.js
exports.add = function() {
    var sum = 0, i = 0, args = arguments, l = args.length;
    while (i < l) {
        sum += args[i++];
    }
    return sum;
};
increment.js
var add = require('math').add;
exports.increment = function(val) {
    return add(val, 1);
};
program.js
var inc = require('increment').increment;
var a = 1;
inc(a); // 2
module.id == "program";

实现

  • 一般由底层框架实现require方法,当然js也可以实现,但对于模块中缺少var而生成的全局变量就不好处理了。
  • 使用exports而不用this来返回api,一方面this需要根据上下文才能知道具体指什么,而exports则更好理解些。

下面贴一个asp实现的require方法:

//by wifeng.cn
//2011/9/15 15:47
//只是实现了“顶级”模块加载,相对的并没有处理
(function(){

    var loaded = {};
    var global = global || {};

    require = function(name){
        var fso = require.fso || (require.fso = new ActiveXObject('Scripting.FileSystemObject'));
        var path, paths = require.paths, found = false;
        for(var i=0; i<paths.length; i++){
            path = Server.MapPath(paths[i] + '/' + name + '.js');
            if(fso.FileExists(path)){
                found = true;
                break;
            }
        }
        if(!found){
            error('module not found');
        }
        if(path in loaded){
            return loaded[path];
        }
        loaded[path] = {};
        var content = fso.OpenTextFile(path, 1).ReadAll();
        var fn = new Function('require', 'exports', content);
        try{
            fn.call(global, require, loaded[path]);
        }catch(e){
            error('runtime error.', e);
        }
        return loaded[path];

        function error(msg, ex){
            throw new Error(msg);
        };
    };

    require.paths = ['bin/lib', '.'];
    require.loaded = loaded;

})()

推荐一个比较完善的asp方法:https://github.com/smith/commonjscript/blob/master/require.js

已有的解决方案

其中大部分项目都按照CommonJS规范实现了require方法: http://wiki.commonjs.org/wiki/CommonJS

其他已有的api: http://wiki.commonjs.org/wiki/Existing_APIs

Ubuntu将窗口按钮位置改成右侧
标签 » Linux 创建时间 » 2011-08-31 11:39:55 评论

修改方法

打开控制台,输入gconf-editor打开配置编辑,修改apps/metacity/general/的button-layout值为menu:minimize,maximize,close

保存立即生效。

令人震惊的asp js框架
标签 » JavaScript ASP 创建时间 » 2011-08-29 22:59:26 评论

从今年初开始,我就开始酝酿做一个传统的asp js编程框架。我是个web前端开发人员,擅长javascript开发。而在服务端,除了nodeJS外(支持nodeJS的主机少而贵),比较靠谱的js服务端貌似就只有asp了。

尽管优秀的php框架百花齐放,仍提不起我的兴趣,总感觉php是一个大杂烩,食之无味。国内的asp主机便宜,且遍地都是。于是自己写的asp js框架也终于有了基本的框架。项目地址:f-asp-javascript

今天在github上闲逛,发了一个aspjs项目,相见恨晚。代码很有条理,优雅的代码,丰富的类库。令人惊讶!大致浏览完主要代码后,真觉得自己完全是在重复造轮子。。。

顺便说一下,该项目附带了nodejs,可以直接在windows下跑哦~

贴一下Readme的框架特色:

  • Clean Code Separation
  • Module System similar to CommonJS
  • Request Routing (Sinatra-style)
  • Rich Templating Engine (based on normal-template from Nitro)
  • Powerful Model layer with validation and relationships (based on ActiveRecord)
  • Event Binding
  • Persistent Session layer with namespacing and expiry options
  • Server-Side HTML Parsing, including DOM, Sizzle and jQuery
  • Helper functions for:
    • JSON
    • date parsing/manipulating/formatting
    • sending email
    • binary data
    • charset conversion
WP7开发记录
标签 » WP7 创建时间 » 2011-08-16 10:08:57 评论

我的手机(htc mozart)浏览器网页点返回键,每次都会震一下,弄得我心情很是不好,目前也没有顺手的浏览器可用。于是自己动手,做了个简单的浏览器。

原理比较简单,就是使用了WebBroswer这个控件,加上不会震动的返回按钮。。

记录下一些技术点:

显示隐藏控件

control.Visibility = Visibility.Collapsed;  //隐藏
control.Visibility = Visibility.Visible;    //显示

启用Javascript

WebBroswer默认不执行Javascript,需要手动开启:

control.IsScriptEnabled = true;

控件排列顺序

<StackPanel Orientation="Vertical"></StackPanel>    横排
<StackPanel Orientation="Horizontal"></StackPanel>  竖排

读取XAP中资源文件

//当文件为Resource类型时,可通过App.GetResourceStream方法取得文件流。
//当文件为Content类型时,可通过Microsoft.Xna.Framework中的TitleContainer.OpenStream方法获得文件流。
App.GetResourceStream(new Uri("Resources/logo.jpg", UriKind.Relative);
StreamReader reader = new StreamReader(TitleContainer.OpenStream("html/demo.html"));
windows环境硬盘安装ubuntu
标签 » Linux Windows 创建时间 » 2011-08-15 11:47:50 评论

准备工作

机器:thinkpad x200 无光驱,无法使用光盘直接安装
已安装系统:windows7
下载ubuntu镜像:ubuntu-11.04-desktop-amd64.iso  拷贝到C盘根目录
从镜像中提取vmlinuz initrd.lz文件到C盘根目录(用于引导镜像安装)
下载grub,将grldr grldr.mbr grub.exe拷贝到C盘根目录(用于引导启动)

为grub创建文件:

C:/menu.lst

title Windows 7
find --set-root /bootmgr
chainloader /bootmgr
boot

title Install Ubuntu
find --set-root /vmlinuz
kernel /vmlinuz boot=casper iso-scan/filename=/ubuntu-11.04-desktop-amd64.iso ro quiet splash locale=zh_CN.UTF-8
initrd /initrd.lz

C:/boot.ini

[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows" /noexecute=optin /fastdetect 
c:\grldr.mbr="grub" 

安装

重启windows,选择grub,选择Install Ubuntu,进入ubuntu live cd桌面,Ctrl-Alt-T打开终端,输入sudo umount -l /isodevice卸载光驱盘,点击桌面上安装按钮,选择ubuntu windows共存方式安装,进行分区等操作,继续完成安装向导。

扫尾

重启系统,进入windows,删除C盘下增加的文件。

列表跳转
全部分类
微博
链接