在Node环境中运行kissy
KISSY 可以运行在 Node 环境中,由于KISSY下辖多数模块都依赖于DOM,只有seed、oo、base、xtemplate等组件可以完整运行于 Node,因此要获得Dom支持需要载入node模块jsdom
,jsdom 可以在服务器端生成一套完整的浏览器宿主环境。
在 node 环境中安装 kissy
这里使用了JSDom 来生成服务端的浏览器宿主环境,KISSY 可以和任何合法的 DOM 树结构一起工作。
npm install kissy jsdom
创建页面 DOM 骨架
JSDom 有非常多有用的特性,并且是高可配置的。下面的代码用JSDom创建了一个简单的浏览器页面环境,最重要的,创建了document 和window。
var jsdom = require('jsdom');
// 将没用的特性都关掉
jsdom.defaultDocumentFeatures = {
// 不需要载入外部资源
FetchExternalResources : false,
// 不需要处理外部资源
ProcessExternalResources : false,
// 关掉随机的事件响应(处于性能考虑)
MutationEvents : false,
// 不需要浏览器自带的Css选择器
QuerySelector : false
};
var dom = jsdom.defaultLevel;
// 创建一个document和window
var document =
jsdom.jsdom("<html><head></head><body><h1>Hello kissy!</h1></body></html>"),
window = document.createWindow();
将 KISSY 运行起来
var KISSY = require('kissy');
KISSY.use('node',function(S){
S.log(S.one('body').html());
});
结果输出:
<h1>Hello kissy!</h1>
执行 Dom 操作
我们增加一点代码,初始化一个Button组件:
// 引用node和button
KISSY.use('node,button',function(S,N,Button){
// 常见的 DOM 操作
S.Node('<div id="J"></div>')
.appendTo('body');
// 生成一个Button
var b = new Button({
content:'hello jayli',
render:'#J'
}).render();
S.log(S.one('body').html());
});
输出结果为:
<h1>Hello kissy!</h1>
<div id="J">
<div class="ks-button ks-button-shown"
role="button"
style="display: ;"
tabindex="0"
hidefocus="true">
hello jayli
</div>
</div>
这就是我们想要的结果,KISSY 已经成功的渲染了一个button组件
使用add()和use()进行代码管理
NodeJS 遵循 CommonJS 规范,文件本身就是一个封闭的上下文。而 KISSY 遵循 KMD 规范。通过固定的模块书写格式来约定模块上下文,除了包装格式不同外,对于模块的定义是完全一致的。因此,在Node环境中也可以使用use()和add()来管理代码。使用方式请参照KMD规范。
var KISSY = require('kissy');
// 注册模块a
KISSY.add('a',function(S){
return {
// A的模块返回
};
});
// 使用模块a
KISSY.use('a',function(S,A){
// Your code...
});
在服务器端模块的载入都是阻塞式的,因此无需预定义Modules列表,即不用预先KISSY.config('modules',{})
来定义模块依赖。
FAQ
1,执行eval()
时如果带有对KISSY的引用,会报错KISSY is not defined
。比如在引用XTemplate的时候,要这样来获得KISSY全局对象
global.KISSY=require('kissy');