nodejs和vuejs的区别
nodejs和vuejs的区别
完全两码事,一个是前端框架,一个是服务端语言。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 执行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
Vue.js是一个构建资料驱动的 web 介面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的资料系结和组合的检视元件。穗如它不仅易于上手,还便于与第三方库或既有专案整合。
另一方面,当与单档案元件和 Vue 生态系统支援的库结合使用时,Vue 也完全能够为复杂的单页应用程式提供驱动。
vuejs 2.0 和 1.0的区别
去除了一些糟粕,例如: vm.$dispatch, vm.$broadcase
简化了一些用法, 例如:v-el: 变为 ref=
更多变化可以到 github 的 vuejs 程式码仓库检视第一手资料~
vuejs vue-cli和webpack的区别
私认为Yeoman的Generators是天生的提供脚手架的工具,如果用webstorm新建Yeoman专案,就可以找到一些有关react的脚手架
nodejs和javascriptsdk和leancloud的区别
node.js和javascript区别还是挺大的,1个平台,1个是程式语言;
javascript是客户端程式语言,需要浏览器的javascript直译器进行解释执行;
node.js是一个基于Chrome JavaScript执行时建立的平台,它是对Google V8引擎进行了封装的执行环境;
简单的说node.js就是把浏览器的直译器封装起来作为伺服器执行平台,用类似javascript的结构语法进行程式设计,在node.js上执行。
apache和nodejs的区别
apache 是多执行绪机制,他为每一个访问使用者建立单独的执行绪,彼此互不影响,但是执行绪占用记忆体,访问量大记忆体会吃不消,
nodejs 和Apache 的一个很大不同在于“单执行绪机制”,不同的使用者使用同一个执行绪,采用非阻塞I/O和事件驱动 有效提高了伺服器的并发数上限(同时线上人数)。
nodejs stream和buffer的区别
max_allowed_packet = 64M
[mysql]
disable-auto-rehash #允许通过TAB键提示
default-character-set = utf8
connect-timeout = 3
get和post的区别,nodejs,use
get是从伺服器上获取资料,post是向伺服器传送资料。 2 get是把引数资料伫列加到提交表单的ACTION属性芦族岁所指的URL中,值和表单内各个栏位一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个栏位与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。使用者看不到这个过程。
3 对于get方式,伺服器端用Request.QueryString获取变数的值,对于post方式,伺服器端用Request.Form获取提交的资料。
4 get传送的资料量较小,不能大于2KB。post传送的资料量较大,一般被预设为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5 get安全性非常低,post安全性较高。
6 HTTP 定义了与伺服器互动的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于资讯获取,而且应该是 安全的和幂等的。所谓安全的意味着该操作用于获取资讯而非修陪睁改资讯。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户开启一个连结时,她可以确信从自身的角度来看没有改变资源。 比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变伺服器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了
7 在FORM提交的时候,如果不指定Method,则预设为GET请求,Form中提交的资料将会附加在url之后,以?分开与url分开。字母数字字元原 样传送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的资料放置在HTTP请求协议头中,而POST提交的资料则放在实体资料中;GET方式提交的资料最多只能有1024位元组,而POST则没有此限制
nodejs4.0和5.0的区别
Node.js v5 is an intermediate feature release line that is best suited for users who have an easier time upgrading their Node.js installations, such as developers using the technology for front-end toolchains. This version will be supported for a maximum of only eight months and will be continually updated with new features and better performance; it is not supported under our LTS plan.
The release cadence for v5.x will be more rapid than in the past. Expect a new release once every one to o weeks for v5.x. If upgrading is a challenge for you, we suggest you do not use this release. There will be significant ongoing development. The focus is on getting the releases to users as soon as possible.
npm has been upgraded to v3 in Node.js v5.0.0, which (amongst other changes) will install dependencies as flat as possible in node_modules. v5.0.0 also es with V8 4.6, which ships the new.target and spread operator JavaScript language features. If you want to learn more about other technical details around this, please check out our release post.
It’s another -quality release from us, and we are averaging roughly 50 unique contributors per month to the codebase. We are extremely excited with all the enthusia *** and amazing work that is going into this Node.js v5 and future releases.
nodejs 中 module.exports 和 exports 的区别
mouble(app)
mouble.exports
你可以用它建立你的模组。例如:(假设这是rocker.js档案)
复制程式码
程式码如下:
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
在另一个档案中你这样引用
复制程式码
程式码如下:
var rocker = require('./rocker.js');
rocker.name(); 'My name is Lemmy Kilmister'
那到底Module.exports是什么呢?它是否合法呢?
其实,Module.exports才是真正的介面,exports只不过是它的一个辅助工具。 最终返回给呼叫的是Module.exports而不是exports。
所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的资讯将被忽略。
修改rocker.js如下:
复制程式码
程式码如下:
module.exports = 'ROCK IT!';
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
再次引用执行rocker.js
复制程式码
程式码如下:
var rocker = require('./rocker.js');
rocker.name(); TypeError: Object ROCK IT! has no method 'name'
发现报错:物件“ROCK IT!”没有name方法
rocker模组忽略了exports收集的name方法,返回了一个字串“ROCK
IT!”。由此可知,你的模组并不一定非得返回“例项化物件”。你的模组可以是任何合法的javascript物件--boolean, number, date,
JSON, string, function,
array等等。
你的模组可以是任何你设定给它的东西。如果你没有显式的给Module.exports设定任何属性和方法,那么你的模组就是exports设定给Module.exports的属性。
下面例子中,你的模组是一个类:
复制程式码
程式码如下:
module.exports = function(name, age) {
this.name = name;
this.age = age;
this.about = function() {
console.log(this.name +' is '+ this.age +' years old');
};
};
可以这样应用它:
复制程式码
程式码如下:
var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); Ozzy is 62 years old
下面例子中,你的模组是一个数组:
复制程式码
程式码如下:
module.exports = ['Lemmy Kilmister', 'Ozzy
O *** ourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
可以这样应用它:
复制程式码
程式码如下:
var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); Rockin in heaven: Ronnie
James Dio
现在你明白了,如果你想你的模组是一个特定的型别就用Module.exports。如果你想的模组是一个典型的“例项化物件”就用exports。
给Module.exports新增属性类似于给exports新增属性。例如:
复制程式码
程式码如下:
module.exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
同样,exports是这样的
复制程式码
程式码如下:
exports.name = function() {
console.log('My name is Lemmy Kilmister');
};
如何系统地学习Node.js?
对于刚接触Node.js的新手来说,第一步无非是打好基础,你需要弄明白以下事情:
JavaScript 的特性和语法。假如你对 JavaScript 还不熟悉的话,推荐书籍及链接:
JavaScript 推荐书籍列表
深入理解JavaScript系列
Node.js 是什么?Node.js与JavaScript的区别是什么?
Node.js的优点?Node.js的缺点?
Node.js适用场景?Node.js不适用的场景?
Node.js的基本语法。Node.js的特性:
单线程
异步 IO
事件驱动
npm 是什么?npm的基本使用
REPL
等等
其实上面的内容,大部分Node.js的书籍蚂缓都有介绍。基本了解了Node.js后,我们可以写一些 hello world 的程序:
搭建一个 HTTP 服务器,返回 hello, world 。(使用 HTTP 模块)
读取一个 txt 文件,将内容显示到命令行中。(使用 fs 模块)
等等
第二步
你也许想,Node.js 只有那些少得可怜的核心模块能做什么呢?别担心,npm 上目前有近 7W 的第三方模块,月下载量高达 2.1亿 (2014—4—20 数据)… 这才是 Node.js 的活力所在。当你对Node.js已经了解的差不多了,并且按耐不住跃跃欲试了。这个时候,我们不妨用 Node.js 的第三方模块做些好玩的事情:
搭建一个微博网站
搭建一个博客网站
搭建一个在线聊天室
写一个简单的爬虫
调用纳粗一些网站的API做一些好玩的东西
等等
但是,并不是说 Node.js 只能做以上事情,几乎其他语言能做的事情 Node.js 都能做,而且有些情况下能做的更好。
第三步
当然,就像学 js 也不能只会用框架一样,学习 Node.js 也不能只会用外部模块。这个时候,我们需要回头深入了解下 Node.js 核心模块的用法。说白了,就是好好看 Node.js 官方 API 文档。看文档是码农必备技能,英语不好的童鞋浏览器装个划词翻译的插件。
第四步
多实践。不管是用核心模块还是外部模块,尝试用 Node.js 解决某个问题或者替换掉以前用其他语言写过的代码。
读源码。这里说的读源码并不是说上来就去读 Node 或者其他较大的框架的源码。这个时候,挑一些简单的只实现某个特定功能的工具模块的源码读,这种模块的代码通常在几百行,阅读起来并不是很困难,但是却能涨不少的姿势。比如:
underscore (学习 JavaScript 的语法和技巧)
等闷茄模等
第五步
坚持第四步。在使用 Node.js 时发现没有合适的模块选择或者选择的模块功能不尽人意,这个时候你可以尝试去创建一个模块或者修改现有的模块,并且使用 npm 发布自己的模块或者去该模块的 GitHub 上提 PR 。
第六步
多实践。这个就不用解释了
读 Node 源码及较大的框架的源码。提高必备
多关注下 GitHub 上的牛人
重复第1-6步
如何用nodejs 把业务逻辑写的漂亮
前段时间的项目使用了Nodejs,中间经过过一次重构,基于Express框架,分享一下经验:
流程Promise化
基于Nodejs的回调语法,你会写出大量下面这种代码:
doAsync1(function () {
doAsync2(function () {
doAsync3(function () {
doAsync4(function () {})
})
})
})
这就是所谓的 “回调黑洞” 了,采用回调写法最大的问题有两个:
一是异常问题的处理,假设你的doAsync4依赖doAsync3的返回值,而doAsync3函数又依赖于doAsync2的返回值,如果doAsync2函数没有返回预想的结果,那么回调仍会继续执行,而如果你的代码里没有做良好的错误处理,可能代码会一直执行到doAsync4,debug的痛苦可想而知。
二是业务流程的变更,现在我们假设要更改业务流程,doAsync2发生在doAsync1之前,你的重构工作量有多少?
这时我们就要考虑使用Promise了,我并不打算在这里详细的介绍Promise,如型雹有趣的是SF就有对于Promise分析良好的系列文章:深入理解Promise五部曲
以及目前常见的回调写法替代方案Node.js回调黑洞全解:Async、Promise 和 Generator
上述代码如果用Promise来重构结果会是这样的:
doAsync1
.then(function (data1) {
return data1
})
.then(function (data2) {
return doAsync2(data2)
})
.then(function (data3) {
return doAsync3(data3)
})
.then(function () {
res.send('数据处理成功')
})
.error(function (error) {
res.send('Error: ' + error)
})
应用分层
在应用中分出Controller层和Model层,不要把页面渲染和逻辑都塞到Router层。理想的结果是渣帆:Controller + Model + Router + Filter,Filter层即是过滤,也可以理解为中间件,可以写一些过滤规则,比如最常见的要求用户登录:
module.exports = {
'/homepage': {
get: ['auth.requireLogin', 'auth.requireAdmin']
}
}
在项目的上一次重构中,我砍掉了Router层,增加租历了一层API,将页面渲染和流程都放在Controller,而数据处理都在API,这样方便未来做数据验证和单元测验:
Controller层
module.exports = {
'/customer': {
get: function (req, res) {
var userInfo = req.body.data
User
.create(userInfo)
.success(function () {})
},
post: function () {}
}
}
API层
module.exports = {
'/customer': {
get: function () {
User
.info()
.success(function (requiredData) {
res.send(requiredData)
})
}
}
}
Model层取决于你用的数据库,流程的Promise化客观上要求了你的Model也要Promise化,Node上常见数据库的ORM都提供了Promise的写法,对应去看就好了。Express并不提供这种Restful路径的写法,我参考Rabbit框架(感谢芋头)基于这个插件改了改:rainbow
最后来看看成果,重构前的代码如下:
重构之后(数据都放在API层了):
NodeJS项目基础结构简单介绍
按照常规,去执行npm start
或者在Terminal中手动输入命令,结果如下:
可以看到是执行了test/package.json文件中的 start 命令,初始packagejson.json文件内容如下:
执行 start ,对应的命令为 node ./bin/www 并在命令行执行。现在项目已经启动成功了,可以打开浏览器输入 localhost:3000 查看一下,但是本次侧重点在于项目启动时候发生的完整的过程。所以……
那么我们需要看一下 ./bin/www 文件
通过 require() 来引入本地安装的包,这里加载了三个包 app、debug 、http ,主要关注一下app.js
可以看到app加载的为该项目基础组件,核心为 var app = express(); 看一下express.js
将app用到的中间件等暴露出来,所以 app = express() 实际上就是加载应用基础组件,生成项目的根节点(当然这个节点是复合的)。所以在app.js中,进行的是加载应用基础组件并进行应用设置初始化(包含了视图目录设置、页面模板引擎设置、中间件的设置、静态资源目录设置以及错误捕捉相关内容)。
继续回到 ,同样将debug配置、http相关组件进行加载。继而是默认端口号的设定。通过http.createServer(app),创建应用服务相关信息,并对端口进行监听。
浏览器输入 localhost:3000
控制台显示:
说明在以 GET 方式请求URI为 "/" 的资源,并以 GET 方式请求 /stylesheets/style.css 资源,这个发生在app.js中我们设定的资源请求。
我们来看下 ./routes/index 文件
即定义网站主型猛页的路由
使用 express.Router 类创建模块化、可挂载的路由句柄(简称:路由模块)。Router 实例是一个完整的中间件和路由系统。最终,在应用中加载路由模块app.use('/', indexRouter);
通过 res.render 对视图进行渲染,上述为对index.ejs的渲兆腊染。 ps:在app.js中已经设定了views的所在目录 。语法: res.render(view [,locals] [,callback])
示例:
区别:路由句柄
为请求处理提供多个回调函数,其行为类似 中间件 。唯一的区别是这些回调函数有可能调用 next('route') 方法跳至下一个同路由的回调函数而略过其他路由回调函数。路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合。
使用一个回调函数处理路由:
使用多个回调函数处理路由(记得指定 next 对象):
使用回调函数数组处理路由:
混合卜猜桥使用函数和函数数组处理路由:
区别:路由方法
一个路由示例:
路由方法源于 HTTP 请求方法,和 express 实例相关联。
获取express的一个实例 app ,通过路由方法(和HTTP请求对应),GET方式请求 "/"。详细的路由方法参考链接: 路由方法
node.js会很难学吗?
node里的js,和前端用的js不一样。。。。前端用的JS,俗称JAVASCRIPT1.0,正规名称是ECMAscript3,而node上用的JS,是ECMAscript6。。
尽管都叫ECMAscript,但相比之下,6和3几乎可以看成两门不同的语言。。3的语法在6中都有,但大概只有6语法总量的三分之一左右。。。另外三分之二,在3中是没有的。。3是基于对象的,而6是面向对象的。。比如6中有类,有lambda表达式,还有和困静态。。通过学习3,是根本不会涉及这些概念的。。
如果以3作为标准JS的话,那么6只有三分像JS,而七分像C#。。对于前端来讲,限于基础不足,NODE会显得非常难学。。。如果之前没学过C#或者JAVA,其实很难平滑过渡到NODE。。。比如下面这是一个类,你会觉得它是仔没你所认为的JS代码?
class BaseResult{
constructor(code,msg,data){
this.code = code;
this.msg = msg;
***.data = data;
}
setCode(code){
this.code = code;
}
getCode(){
return this.code;
}
setMsg(msg){
this.msg = msg;
}
getMsg(){
return this.msg;
}
setData(data){
***.data = data;
}
getData(){
return ***.data;
}
getRes(){
return {'code':this.code,'msg':this.msg,'data':***.data};
}
}
const SUCCESS = new BaseResult(0,'成功',{a:10,b:[{c:10,d:20},{e:30,f:40}]});
console.log(SUCCESS);
所以如果你目前只是学习前端,NODE可以暂时跳过,因为你根本学不会,即便自己觉得会了,到了做项目,你就明白自己根本不是真会,不理解面向对象,根本做不了完整的后端项目。。。要想转到后端,面向对象的ES6是根本跳不过去的
如果唤戚念将来有机会学学C#或者JAVA,养成了面向对象思想,再学NODE就会变得非常平滑。。