SlideShare a Scribd company logo
nodejs在新浪微博前端打
     @月明沧海
系统简介
js批量压缩合并系统

css批量压缩合并系统

  发及仿真测试支         系统

在线部署仿真环境工具

动态文件合并服务

安装: npm install weibo-packager
js批量压缩合并
$Import(‘a.b.c’); //加载依赖文件.

遍历输入目录,收集js和非js文件

配置输出目录,保持和输入目录相同结构(微调)

先使用uglify-js压缩单个js

解析提取 $Import 再合并js文件

写文件,同时计算其md5

遍历js 语法树来提取       步加载的文件路径
js批量压缩合并




正则替换$Import,合并js. 剔除重 $Import
挑战:提取 步加载文件




使用uglify-js遍历js语法树,提取(替换) 步加载的js路径
为md5后的文件路径(要防止该语句被混淆替换).
uglify-js遍历AST




在线演示: http://files.zhaojie.me/demos/js-parsers/
uglifyjs-parser.html
uglify-js动态修改js AST




AST一次性生成,但可多次遍历,修改.

遍历ast获取信息比    杂的正则表达式简单可靠

修改后的ast可以gen_code 产生新js源码.

pro.ast_add_scope可防止原ast被修改.遍历会生成新ast.
esprima
esprima is a js parser in js.

ast结构更清晰,可读性更好.

解析速度更快.

parser demo: http://esprima.org/demo/
parse.html

语法高亮demo: http://esprima.org/demo/
合并js 小问题
多个文件均以函数闭包封装,但可能没有以’;’分
号结束.解决方法:合并后文件以’;n’间隔. 这能
预防该问题,且合并了几个文件就是几行,一目了
然.

uglify-js在1.2.6版才有字符串相加合并优化(对
大量模板字符串很有益处)

需仔细斟酌uglify-js各项优化选项(微博   闭了
make_seqs优化   )
css批量压缩合并
@import‘../../modele/base/reset.css’;//css引用

遍历输入目录,收集css和非css文件

配置输出目录,保持和输入目录相同结构

  制非css文件(图片等),并计算其md5

读取所有css文件

合并css,同时剔除重         @import文件

剔除重     css rule(实验性功能)
挑战:剔除css重

css解析有严格先后顺序(不同于js),有重
@import时只能去掉前面的@import,只保留最后
一个@import

解决方法:先建立@import树;再深度优先遍历该
树,剪除重   叶节点.

@import正则表达式需要兼容各   形式(浏览器
剔除重 css规则
按’}’来切分css规则




排重处理(只保留相同规则的最后那条规则)
合并css时重新计算背景

先计算背景图片相当于原css文件的绝对路径;

再计算背景图片绝对路径与合并后的css文件的
相对路径.

path.relative 用于计算相对路径很方便
css压缩合并tips
@import语句末尾的’;’分号必须替换干净.否则
紧临其后的那条css规则会失效.

@charset声明语句必须以分号结尾.否则可能会
样式错乱.

IE浏览器下单个css规则数量有限制(4096?),所
以单个css文件不能太大,否则会有    染问题.
合并文件-去utf-8 bom头

 不去掉bom头文件合并后会导致乱码(IE?)

 str.replace(/^xefxbbxbf/,’’);

 js,css,html均需考虑去掉bom头.

 <meta http-equiv=”Content-Type”
 content=”text/html;charset=utf-8” />
发,仿真一体化服务器



自动识       发环境,仿真环境

自动代理不存在的工程资源

cluster--master--worker
nodejs proxy功能的演化
1 最初使用http.createClient实现

2 继而使用pipe接口简化代码

3 目前使用http.request重新实现

pipe和on,addListener可以并存
tips
bodyParser中间件与proxy冲突(解决方案:缓存POST内
容,然后使用querystring解析参数)

process.title mac系统不可用,linux下可用 (process.title
= 'weibo-ria-server';)

dns.resolve 与 dns.lookup 对本机hosts处理不同.

console.time与consle.timeEnd计时

大坑: Cannot spawn(or fork) a ‘node’ child process
from within a cluster worker in Node v0.6.18
重启nodejs服务器
设置主进程名称,记录主进程pid (.pid文件)

主进程退出时杀死所有子进程

根据主进程pid或者名称杀死主进程,进而杀死所有子进
程

任意目录下执行restart.sh时,日志都重定向到约定位置

‘SIGTERM’ VS ‘SIGKILL’ (kill VS kill -9)

‘SIGTERM’信号可以被捕获,process ‘exit’事件也会触
重启nodejs服务器
动态文件合并服务
文件合并服务可以充分利用nodejs chunked输
出, 流式读取,pipe到http应答.可以边读取边发
送;不用合并后再发送.
在线部署仿真环境

chunked输出时,设置Content-Type时必须指明
charset,否则浏览器不即时           染.(设置charset后
不必满1024字节,浏览器就能实时                染)




demo: https://gist.github.com/2419203
在线部署仿真环境
tips

nodejs spawn的node进程必须有明              exit code,否则其exit
事件不会被触发.

require('child_process').spawn(process.execPath || 'node',
['export','--non-interactive','--trust-server-cert','--
force','--username',name,'--
password',passwd,svn,source]);

svn export --non-interactive --trust-server-cert --force
--username xyz --password zyx svnURI
tips

console.log 严重影响性能(50%? 看场景)

log必须严格分级处理,一般只输出warn和error
日志

md5 流式读取与整体读取的hash一致
(require('crypto').createHash('md5').update(dat
a).digest("hex"))
tips

util.format可做简单模板变量替换

__dirname

__filename

独立自包含静态服务
tips
JSON.stringify.length === 3;
JSON.stringify(obj,null,3) 美化(缩进结构)输出

v8支持ECMA5标准,不用考虑兼容性. [].filter
[].forEach, Object.keys ...

connect 显示目录列表的插件不支持IE6
https://github.com/senchalabs/connect/
issues/531

sh.js (http://shjs.tuton.fr) 是   步执行系统命
令的(process.nextTick),和同步代码结合时需要
用到的                    源组件


uglify-js   git@github.com:mishoo/UglifyJS.git


arguments      http://github.com/fczuardi/node-
arguments


express     git://github.com/visionmedia/express
其他nodejs项目


邮件发微博,基于haraka(nodejs smtp server)
http://code.google.com/p/mail2http/

cloud9 ide (http://session.im:5555)
Thank U,Man!


@老狗    始戒烟

@FlashSoft

@貘吃馍香

More Related Content

What's hot

使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
cachowu
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
Alex Lau
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程Simon Su
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
Ben Lue
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
zhen chen
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践
longhao
 
Openstack swift, how does it work?
Openstack swift, how does it work?Openstack swift, how does it work?
Openstack swift, how does it work?
kao kuo-tung
 
快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚
Lorex L. Yang
 
前端框架發展
 前端框架發展 前端框架發展
前端框架發展
Chi-wen Sun
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openpartylitaocheng
 
前端各階段工作
前端各階段工作前端各階段工作
前端各階段工作
Chi-wen Sun
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
litaocheng
 
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
Will Huang
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
GO LL
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
dennis zhuang
 
Apache+php+mysql在Linux下的安装与配置
Apache+php+mysql在Linux下的安装与配置Apache+php+mysql在Linux下的安装与配置
Apache+php+mysql在Linux下的安装与配置wensheng wei
 
Docker一期培训
Docker一期培训Docker一期培训
Docker一期培训
青帅 常
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡guest2d0fe3
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡Cary Yang
 

What's hot (20)

使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践
 
Openstack swift, how does it work?
Openstack swift, how does it work?Openstack swift, how does it work?
Openstack swift, how does it work?
 
快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚快速入坑 Node.js - 0613 SITCON 雲林定期聚
快速入坑 Node.js - 0613 SITCON 雲林定期聚
 
前端框架發展
 前端框架發展 前端框架發展
前端框架發展
 
Couchdb Beijing Openparty
Couchdb Beijing OpenpartyCouchdb Beijing Openparty
Couchdb Beijing Openparty
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 
前端各階段工作
前端各階段工作前端各階段工作
前端各階段工作
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
《保哥線上講堂》打造一個具有 Linux 溫度的 Windows 命令提示字元工具
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战QCon - 一次 Clojure Web 编程实战
QCon - 一次 Clojure Web 编程实战
 
Apache+php+mysql在Linux下的安装与配置
Apache+php+mysql在Linux下的安装与配置Apache+php+mysql在Linux下的安装与配置
Apache+php+mysql在Linux下的安装与配置
 
Docker一期培训
Docker一期培训Docker一期培训
Docker一期培训
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
 
使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡使用Nginx轻松实现开源负载均衡
使用Nginx轻松实现开源负载均衡
 

Similar to nodejs在微博前端开发中的应用

使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發
Fred Chien
 
GNU Build System
GNU Build SystemGNU Build System
GNU Build System
imacat .
 
Hadoop平台搭建
Hadoop平台搭建Hadoop平台搭建
Hadoop平台搭建Liyang Tang
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newYiwei Ma
 
Kissy模块化实践
Kissy模块化实践Kissy模块化实践
Kissy模块化实践yiming he
 
Kissy design
Kissy designKissy design
Kissy design
yiming he
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renrend0nn9n
 
Eclipse4.0+cdt+cygwin+gdb开发环境搭建
Eclipse4.0+cdt+cygwin+gdb开发环境搭建Eclipse4.0+cdt+cygwin+gdb开发环境搭建
Eclipse4.0+cdt+cygwin+gdb开发环境搭建
_MoYang
 
Nodejs api server_implement
Nodejs api server_implementNodejs api server_implement
Nodejs api server_implement
Chi-wen Sun
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)Timothy Chen
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
wavefly
 
unix toolbox 中文版
unix toolbox 中文版unix toolbox 中文版
unix toolbox 中文版Jie Bao
 
使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版pigso
 
Inside the browser
Inside the browserInside the browser
Inside the browser
otakustay
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
Michael Chen
 
Nae client(using Node.js to create shell cmd)
Nae client(using Node.js to create shell cmd)Nae client(using Node.js to create shell cmd)
Nae client(using Node.js to create shell cmd)
fisher zheng
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)Yiwei Ma
 
Ruby on Rails 開發環境建置 for Ubuntu
Ruby on Rails 開發環境建置 for UbuntuRuby on Rails 開發環境建置 for Ubuntu
Ruby on Rails 開發環境建置 for Ubuntu
MarsZ Chen
 

Similar to nodejs在微博前端开发中的应用 (20)

使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發
 
GNU Build System
GNU Build SystemGNU Build System
GNU Build System
 
Hadoop平台搭建
Hadoop平台搭建Hadoop平台搭建
Hadoop平台搭建
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 new
 
Kissy模块化实践
Kissy模块化实践Kissy模块化实践
Kissy模块化实践
 
Kissy design
Kissy designKissy design
Kissy design
 
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
 
Eclipse4.0+cdt+cygwin+gdb开发环境搭建
Eclipse4.0+cdt+cygwin+gdb开发环境搭建Eclipse4.0+cdt+cygwin+gdb开发环境搭建
Eclipse4.0+cdt+cygwin+gdb开发环境搭建
 
Nodejs api server_implement
Nodejs api server_implementNodejs api server_implement
Nodejs api server_implement
 
0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)0118 Windows Server 2008 的伺服器核心 (Server Core)
0118 Windows Server 2008 的伺服器核心 (Server Core)
 
Google protocol buffers简析
Google protocol buffers简析Google protocol buffers简析
Google protocol buffers简析
 
unix toolbox 中文版
unix toolbox 中文版unix toolbox 中文版
unix toolbox 中文版
 
使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版使用Nginx轻松实现开源负载均衡——对外版
使用Nginx轻松实现开源负载均衡——对外版
 
Inside the browser
Inside the browserInside the browser
Inside the browser
 
Beyond rails server
Beyond rails serverBeyond rails server
Beyond rails server
 
Nae client(using Node.js to create shell cmd)
Nae client(using Node.js to create shell cmd)Nae client(using Node.js to create shell cmd)
Nae client(using Node.js to create shell cmd)
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)
 
Ruby on Rails 開發環境建置 for Ubuntu
Ruby on Rails 開發環境建置 for UbuntuRuby on Rails 開發環境建置 for Ubuntu
Ruby on Rails 開發環境建置 for Ubuntu
 
Berserk js
Berserk jsBerserk js
Berserk js
 

nodejs在微博前端开发中的应用

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n