张艺兴代言的华为手机像素好还是oppor11像素好

We are drowning in information and starving for knowledge.
Step 1: 点击Debug按钮,调出launch.json文件,更改program的路径为目标js文件。
生成的luanch.json文件在.vscode文件下
step2:接下来就可以加断点调试了
阅读(...) 评论()用Visual Studio Code写Node.js - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
(以下简称vsc)最近更新到了0.8.0版本,新加的一些特性都很nice。多了几个配色方案(流行的monokai配色也有了,虽然效果并不好),也支持自定义安装目录了。最让我感动的是对jsx文件做了语法高亮,写react的时候再也不是一片黑色了。
今天来了兴致,推荐一下,希望有更多的同学来使用这个编辑器。
vsc的宣传语是:
一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。
按它说的,vsc特别适合来作为前端开发编辑器。
内置html开发神器emmet(zencoding),对css及其相关编译型语言Less和Sass都有很好的支持。
当然,最nice的还是写js代码了,这也是我接下来要着重介绍的功能。
因为之前微软推出了语言,结合tsd文件,用visual studio写typescript代码是相当爽的,智能提示的功能非常nb。
这个功能理所应当也被vsc继承了。
目前主流的前端类库/框架,包括node.js及其模块/框架都有相应的tsd文件,可以去上找一下。
在项目中引入对应文件,就可以有智能提示了。
这里以angular为例,使用步骤如下:
全局安装tsd,通过tsd安装.d.ts文件。这样会在项目下面生成.typings目录,目录下面就是下载的.d.ts文件,再写代码的时候就会有智能提示了。具体用法参考。
npm install -g tsd
tsd query angular --action install
如果不想自己手工引入,也可以在angular变量后面按ctrl+k,会有个灯泡图片,点击灯泡图片就会有对应提示,选择下载xx.d.ts文件就可以了,编辑器会下载对应文件放在.typings目录。
过程如下图:
再来个node.js的:
说完智能提示,再说代码调试。
之前写过文章介绍过node.js的调试方案()。从vsc发布后,我就一直用它写代码,也是用它来调试node.js代码。
使用方法也很简单,步骤如下:
打开要调试的文件,按f5,编辑器会生成一个launch.json
修改launch.json相关内容,主要是name和program字段,改成和你项目对应的
点击编辑器左侧长得像蜘蛛的那个按钮
点击左上角DEBUG后面的按钮,启动调试
打断点,尽情调试
过程如下图:
最后,再赠送彩蛋一个。
Node API 查看
在写node.js代码的时候,有时会忘记某个模块中有哪些方法及其用法,经常要去官网翻一下api文档。
这里介绍下怎么使用vsc来搞定这一问题。
打开vsc控制台(Help & Toggle Developer Tools & Console)
在控制台写代码,查询模块方法。
过程如下图:
vsc是用atom-shell(现在叫)写的,这玩意和node-webkit(现在叫)一样,都是把node.js和chrome结合起来的工具,所以可以这么使用。
不过vsc使用到的node.js模块并不多,比如引用util和vm等会报错,用node-webkit就不会这样。
vsc和其他编辑器(sublime text,atom,webstorm等)相比,某些方面还存在很多问题。对于一个前端工程师来说,它已经足够好了。
当然了,它在不断改进。等着它支持插件系统,支持vim模式。
vsc确实很好用。现在一直在用着。
好文,支持。
同样是electron,为什么VSCODE这么流畅,ATOM这么卡呢
vsc他爹家大业大,他哥的都可以是他的。
mark,要试试了。
因为vsc的架构师看过Fate,创建了一个叫Servant的进程专门来生成高亮代码的HTML,所以主进程只需要负责找Servant生成然后innerHTML就好了。(不过其实具体逻辑还是蛮复杂的~)
赶紧敲打键盘带来光标扇动的快感还是不及sublime,可惜sublime 的作者至今失联
这篇文章不错,可以转载么?转载到node全栈公众号
.d.ts 文件没有版本管理, 就是我用着node v4, 还是 node v0.12.* 都是这一个 typing
支持coffee吗。。
通过来管理.d.ts的话是支持版本管理的
tsd query node -v all
可以显示所有node.d.ts的版本,选择对应版本下载就可以了。
tsd query node -v &&0.10& --action install
node v4的话才出没多久,还没跟上进度,后续应该就有了。
官方介绍是支持coffee的,我没写过,具体不清楚。
其实我一直搞不懂为什么不能按行剪切,复制粘贴。麻烦得很,最后还是用回vim.
还有tab在文件管理器上面也是很蛋疼的设定。开得多了,文件浏览器就小了。很不习惯。
对如我这等菜鸟,记住vim的快捷键不乱都是一个艰巨的任务。
都不敢轻易安装visual studio,已安装完就占去了及时GB,什么套件都带上。
请教下,为什么我debug时候,遇到连接MYSQL就出错,会抛出连接异常来,但是如果不用VSC就正常可以连DB。
O(∩_∩)O谢谢啊
这个自动补全,看起来相当牛逼啊
已经下载来尝试了哈~
img link script background没有路径提示、、、
怎么收藏?
道理我都懂,但是你res.end(‘fuck u’)是啥意思呢。
我感觉还是webstorm 好用些
唯一不好的是不同同时罗列多个项目文件。
微软黑科技从安装包的体积上就能看出来,已经放弃atom
sublime轻量级,vsc稍重点,不过用起来挺爽的
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的[nodejs]使用神器webstorm调试nodejs - 推酷
[nodejs]使用神器webstorm调试nodejs
& & 还在终端敲命令,定位到文件夹然后node xxx.js? 你out了。现在我们有更好的调试nodejs方式为什么不去使用呢,只需要一个快捷键而已。ws本身对nodejs有良好的支持,利用ws开发调试nodejs生活将变得很轻松。
1.安装nodejs,nodejs已经提供了各平台的编译过的文件不用辛苦编译了,下载安装对应自己平台的版本。
2.安装javascript神器webstorm,webstorm也是一个好软件,支持多平台。特别提醒ws是是一个商业收费软件,可以试用30天。
3.打开ws进行nodejs配置,从3.0开始ws上增加了一个非常醒目的nodejs图标,下面以osx版本为例,win版的完全一致没有打的区别。
点击这个nodejs图标,会弹出下面的对话框对nodejs路径等相关进行配置
win版非常方便只要去安装目录的bin目录去定位node.exe就行了,macos如果遇到问题的话在终端输入一下命令,找到相关路径输入就可以了
$ open /usr/
如果太麻烦,直接拷贝我提供的路径
/usr/local/bin/node
其他参数不用修改。
4.对你的nodejs开发文件夹进行配置,点击配置按钮对下面的对话框进行具体配置
通过以上几步基本上完成了配置。
1.调试时只要点击run按钮,软件就会自动启动控制台。
2.在浏览器中访问相关地址
3.使用console命令
console.log(this);
输出上下文环境
怎么样是不是很棒,非常强悍的。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致NodeJS 开发者的 10 个常见错误 - WEB前端 - 伯乐在线
& NodeJS 开发者的 10 个常见错误
自 Node.js 公诸于世的那一刻,就伴随着赞扬和批评的声音。这个争论仍在持续,而且并不会很快消失。而我们常常忽略掉这些争论产生的原因,每种编程语言和平台都是因某些问题而受到批评,而这些问题的产生,是取决于我们如何使用这个平台。不管有多难才能写出安全的 Node.js 代码,或有多容易写出高并发的代码,该平台已经有相当长一段时间,并已被用来建立一个数量庞大、稳健和成熟的 web 服务器。这些 web 服务器伸缩性强,并且它们通过在 Internet 上稳定的运行时间,证明自己的稳定性。
然而,像其它平台一样,Node.js 容易因开发者问题而受到批评。一些错误会降低性能,而其它一些问题会让 Node.js 直接崩溃。在这篇文章里,我们将会聊一聊关于 Node.js 新手的 10 个常犯错误,并让他们知道如何避免这些错误,从而成为一名 Node.js 高手。
错误 #1:阻塞事件循环
JavaScript 在 Node.js (就像在浏览器一样) 提供单线程执行环境。这意味着你的程序不能同时执行两部分代码,但能通过 I/O 绑定异步回调函数实现并发。例如:一个来自Node.js 的请求是到数据库引擎获取一些文档,在这同时允许 Node.js 专注于应用程序其它部分:
JavaScript
// Trying to fetch an user object from the database. Node.js is free to run other parts of the code from the moment this function is invoked..
// 尝试从数据库中获取一个用户对象。在这个函数执行的一刻,Node.js 有空去运行代码其它部分..
db.User.get(userId, function(err, user) {
// .. until the moment the user object has been retrieved here
// .. 直到用户对象检索到这里的那一刻
// Trying to fetch an user object from the database. Node.js is free to run other parts of the code from the moment this function is invoked..// 尝试从数据库中获取一个用户对象。在这个函数执行的一刻,Node.js 有空去运行代码其它部分..db.User.get(userId, function(err, user) { // .. until the moment the user object has been retrieved here&&&&&&&&// .. 直到用户对象检索到这里的那一刻})
然而,具有计算密集型代码的 Node.js 实例被数以万计客户端同时连接执行时,会导致阻塞事件循环,并使所有客户端处于等待响应状态。计算密集型代码,包括尝试给一个庞大数组进行排序操作和运行一个格外长的循环等。例如:
JavaScript
function sortUsersByAge(users) {
users.sort(function(a, b) {
return a.age & b.age ? -1 : 1
function sortUsersByAge(users) { users.sort(function(a, b) {
return a.age & b.age ? -1 : 1 })}
基于小 “users” 数组执行 “sortUserByAge” 函数,可能没什么问题,当基于庞大数组时,会严重影响整体性能。如果在不得不这样操作的情况下,你必须确保程序除了等待事件循环而别无他事(例如,用 Node.js 建立命令行工具的一部分,整个东西同步运行是没问题的),然后这可能没问题。然而,在 Node.js 服务器实例尝试同时服务成千上万个用户的情况下,这将是一个毁灭性的问题。
如果用户数组是从数据库检索出来的,有个解决办法是,先在数据库中排序,然后再直接检索。如果因需要计算庞大的金融交易历史数据总和,而造成阻塞事件循环,这可以创建额外的worker / queue 来避免阻塞事件循环。
正如你所看到的,这没有新技术来解决这类 Node.js 问题,而每种情况都需要单独处理。而基本解决思路是:不要让 Node.js 实例的主线程执行 CPU 密集型工作 – 客户端同时链接时。
错误 #2:调用回调函数多于一次
JavaScript 一直都是依赖于回调函数。在浏览器中,处理事件是通过调用函数(通常是匿名的),这个动作如同回调函数。Node.js 在引进 promises 之前,回调函数是异步元素用来互相连接对方的唯一方式 。现在回调函数仍被使用,并且包开发者仍然围绕着回调函数设计 APIs。一个关于使用回调函数的常见 Node.js 问题是:不止一次调用。通常情况下,一个包提供一个函数去异步处理一些东西,设计出来是期待有一个函数作为最后一个参数,当异步任务完成时就会被调用:
JavaScript
module.exports.verifyPassword = function(user, password, done) {
if(typeof password !== ‘string’) {
done(new Error(‘password should be a string’))
computeHash(password, user.passwordHashOpts, function(err, hash) {
done(null, hash === user.passwordHash)
123456789101112131415
module.exports.verifyPassword = function(user, password, done) { if(typeof password !== ‘string’) {
done(new Error(‘password should be a string’))
return }& computeHash(password, user.passwordHashOpts, function(err, hash) {
done(null, hash === user.passwordHash) })}
注意每次调用 “done” 都有一个返回语句(return),而最后一个 “done” 则可省略返回语句。这是因为调用回调函数后,并不会自动结束当前执行函数。如果第一个 “return” 注释掉,然后给这个函数传进一个非字符串密码,导致 “computeHash” 仍然会被调用。这取决于 “computeHash” 如何处理这样一种情况,“done” 可能会调用多次。任何一个人在别处使用这个函数可能会变得措手不及,因为它们传进的该回调函数被多次调用。
只要小心就可以避免这个 Node.js 错误。而一些 Node.js 开发者养成一个习惯是:在每个回调函数调用前添加一个 return 关键字。
JavaScript
return done(err)
if(err) { return done(err)}
对于许多异步函数,它的返回值几乎是无意义的,所以该方法能让你很好地避免这个问题。
错误 #3:函数嵌套过深
函数嵌套过深,时常被称为“回调函数地狱”,但这并不是 Node.js 自身问题。然而,这会导致一个问题:代码很快失去控制。
JavaScript
function handleLogin(..., done) {
db.User.get(..., function(..., user) {
if(!user) {
return done(null, ‘failed to log in’)
utils.verifyPassword(..., function(..., okay) {
if(okay) {
return done(null, ‘failed to log in’)
session.login(..., function() {
done(null, ‘logged in’)
123456789101112131415
function handleLogin(..., done) { db.User.get(..., function(..., user) {
if(!user) {
return done(null, ‘failed to log in’)
utils.verifyPassword(..., function(..., okay) {
if(okay) {
return done(null, ‘failed to log in’)
session.login(..., function() {
done(null, ‘logged in’)
任务有多复杂,代码就有多糟糕。以这种方式嵌套回调函数,我们很容易就会碰到问题而崩溃,并且难以阅读和维护代码。一种替代方式是以函数声明这些任务,然后将它们连接起来。尽管,有一种最干净的方法之一 (有争议的)是使用 Node.js 工具包,它专门处理异步 JavaScript 模式,例如
JavaScript
function handleLogin(done) {
async.waterfall([
function(done) {
db.User.get(..., done)
function(user, done) {
if(!user) {
return done(null, ‘failed to log in’)
utils.verifyPassword(..., function(..., okay) {
done(null, user, okay)
function(user, okay, done) {
if(okay) {
return done(null, ‘failed to log in’)
session.login(..., function() {
done(null, ‘logged in’)
], function() {
12345678910111213141516171819202122232425
function handleLogin(done) { async.waterfall([
function(done) {
db.User.get(..., done)
function(user, done) {
if(!user) {
return done(null, ‘failed to log in’)
utils.verifyPassword(..., function(..., okay) {
done(null, user, okay)
function(user, okay, done) {
if(okay) {
return done(null, ‘failed to log in’)
session.login(..., function() {
done(null, ‘logged in’)
} ], function() {
// ... })}
类似于 “async.waterfall”,Async.js 提供了很多其它函数来解决不同的异步模式。为了简洁,我们在这里使用一个较为简单的案例,但实际情况往往更糟。
错误 #4:期望回调函数以同步方式运行
异步程序的回调函数并不是 JavaScript 和 Node.js 独有的,但它们是造成回调函数流行的原因。而对于其它编程语言,我们潜意识地认为执行顺序是一步接一步的,如两个语句将会执行完第一句再执行第二句,除非这两个语句间有一个明确的跳转语句。尽管那样,它们经常局限于条件语句、循环语句和函数调用。
然而,在 JavaScript 中,回调某个特定函数可能并不会立刻运行,而是等到任务完成后才运行。下面例子就是直到没有任何任务,当前函数才运行:
JavaScript
function testTimeout() {
console.log(“Begin”)
setTimeout(function() {
console.log(“Done!”)
}, duration * 1000)
console.log(“Waiting..”)
function testTimeout() { console.log(“Begin”) setTimeout(function() {
console.log(“Done!”) }, duration * 1000) console.log(“Waiting..”)}
你会注意到,调用 “testTimeout” 函数会首先打印 “Begin”,然后打印 “Waiting..”,紧接大约一秒后才打印 “Done!”。
任何一个需要在回调函数被触发后执行的东西,都要把它放在回调函数内。
错误 #5:用“exports”,而不是“module.exports”
Node.js 将每个文件视为一个孤立的小模块。如果你的包(package)含有两个文件,或许是 “a.js” 和 “b.js”。因为 “b.js” 要获取 “a.js” 的功能,所以 “a.js” 必须通过为 exports 对象添加属性来导出它。
JavaScript
exports.verifyPassword = function(user, password, done) { ... }
// a.jsexports.verifyPassword = function(user, password, done) { ... }
当这样操作后,任何引入 “a.js” 模块的文件将会得到一个带有属性方法 “verifyPassword” 的对象:
JavaScript
require(‘a.js’) // { verifyPassword: function(user, password, done) { ... } }
// b.jsrequire(‘a.js’) // { verifyPassword: function(user, password, done) { ... } }
然而,如果我们想直接导出这个函数,而不是作为某个对象的属性呢?我们能通过覆盖 exports 对象来达到这个目的,但我们不能将它视为一个全局变量:
JavaScript
module.exports = function(user, password, done) { ... }
// a.jsmodule.exports = function(user, password, done) { ... }
注意,我们是如何将 “exports” 作为 module 对象的一个属性。在这里知道 “module.exports” 和 “exports” 之间区别是非常重要的,并且这经常会导致 Node.js 开发新手们产生挫败感。
JavaScript 有个“异常”概念。异常处理与大多数传统语言的语法类似,例如 Java 和 C++,JavaScript 能在 try-catch 块内 “抛出(throw)” 和 捕捉(catch)异常:
JavaScript
function slugifyUsername(username) {
if(typeof username === ‘string’) {
throw new TypeError(‘expected a string username, got '+(typeof username))
var usernameSlug = slugifyUsername(username)
} catch(e) {
console.log(‘Oh no!’)
123456789101112
function slugifyUsername(username) { if(typeof username === ‘string’) {
throw new TypeError(‘expected a string username, got '+(typeof username)) } // ...}&try { var usernameSlug = slugifyUsername(username)} catch(e) { console.log(‘Oh no!’)}
然而,如果你把 try-catch 放在异步函数内,它会出乎你意料,它并不会执行。例如,如果你想保护一段含有很多异步活动的代码,而且这段代码包含在一个 try-catch 块内,而结果是:它不一定会运行。
JavaScript
db.User.get(userId, function(err, user) {
usernameSlug = slugifyUsername(user.username)
} catch(e) {
console.log(‘Oh no!’)
123456789101112
try { db.User.get(userId, function(err, user) {
usernameSlug = slugifyUsername(user.username)
// ... })} catch(e) { console.log(‘Oh no!’)}
如果回调函数 “db.User.get” 异步触发了,虽然作用域里包含的 try-catch 块离开了上下文,仍然能捕捉那些在回调函数的抛出的错误。
这就是 Node.js 中如何处理错误的另外一种方式。另外,有必要遵循所有回调函数的参数(err, …)模式,所有回调函数的第一个参数期待是一个错误对象。
错误 #7:认为数字是整型
数字在 JavaScript 中都是浮点型,JS 没有整型。你可能不能预料到这将是一个问题,因为数大到超出浮点型范围的情况并不常见。
JavaScript
Math.pow(2, 53)+1 === Math.pow(2, 53)
Math.pow(2, 53)+1 === Math.pow(2, 53)
不幸的是,在 JavaScript 中,这种关于数字的怪异情况远不止于此。尽管数字都是浮点型,对于下面的表达式,操作符对于整型也能正常运行:
JavaScript
5 && 1 === 2 // true
5 && 1 === 2 // true
然而,不像算术运算符那样,位操作符和位移操作符只能操作后 32 位,如同 “整型” 数。例如,尝试位移 “Math.pow(2,53)” 1 位,会得到结果 0。尝试与 1 进行按位或运算,得到结果 1。
JavaScript
Math.pow(2, 53) / 2 === Math.pow(2, 52) // true
Math.pow(2, 53) && 1 === 0 // true
Math.pow(2, 53) | 1 === 1 // true
Math.pow(2, 53) / 2 === Math.pow(2, 52) // trueMath.pow(2, 53) && 1 === 0 // trueMath.pow(2, 53) | 1 === 1 // true
你可能很少需要处理很大的数,但如果你真的要处理的话,有很多大整型库能对大型精度数完成重要的数学运算,如
大家都说想建立一个小型代理服务器,它能响应从其它服务器获取内容的请求。作为一个案例,我们将建立一个供应
图像的小型 Web 服务器:
JavaScript
var http = require('http')
var crypto = require('crypto')
http.createServer()
.on('request', function(req, res) {
var email = req.url.substr(req.url.lastIndexOf('/')+1)
if(!email) {
res.writeHead(404)
return res.end()
var buf = new Buffer()
http.get('/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {
var size = 0
resp.on('data', function(chunk) {
chunk.copy(buf, size)
size += chunk.length
.on('end', function() {
res.write(buf.slice(0, size))
.listen(8080)
12345678910111213141516171819202122232425
var http = require('http')var crypto = require('crypto')&http.createServer().on('request', function(req, res) { var email = req.url.substr(req.url.lastIndexOf('/')+1) if(!email) {
res.writeHead(404)
return res.end() }& var buf = new Buffer(1024*1024) http.get('/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {
var size = 0
resp.on('data', function(chunk) {
chunk.copy(buf, size)
size += chunk.length
.on('end', function() {
res.write(buf.slice(0, size))
}) })}).listen(8080)
在这个特殊例子中有一个 Node.js 问题,我们从 Gravatar 获取图像,将它读进缓存区,然后响应请求。这不是一个多么糟糕的问题,因为 Gravatar 返回的图像并不是很大。然而,想象一下,如果我们代理的内容大小有成千上万兆。那就有一个更好的方法了:
JavaScript
http.createServer()
.on('request', function(req, res) {
var email = req.url.substr(req.url.lastIndexOf('/')+1)
if(!email) {
res.writeHead(404)
return res.end()
http.get('/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {
resp.pipe(res)
.listen(8080)
12345678910111213
http.createServer().on('request', function(req, res) { var email = req.url.substr(req.url.lastIndexOf('/')+1) if(!email) {
res.writeHead(404)
return res.end() }& http.get('/avatar/'+crypto.createHash('md5').update(email).digest('hex'), function(resp) {
resp.pipe(res) })}).listen(8080)
这里,我们获取图像,并简单地通过管道响应给客户端。绝不需要我们在响应之前,将全部内容读取到缓冲区。
错误 #9:把 Console.log 用于调试目的
在 Node.js 中,“console.log” 允许你向控制台打印几乎所有东西。传递一个对象给它,它会以 JavaScript 对象字面量的方式打印出来。它接受任意多个参数,并以空格作为分隔符打印它们。有许多个理由让开发者很想用这个来调试(debug)自己的代码;然而,我强烈建议你避免在真正程序里使用 “console.log” 。你应该避免在全部代码里使用 “console.log” 进行调试(debug),当不需要它们的时候,应注释掉它们。相反,使用专门为调试建立的库,如:。
当你开始编写应用程序时,这些库能方便地启动和禁用某行调试(debug)功能。例如,通过不设置 DEBUG 环境变量,能够防止所有调试行被打印到终端。使用它很简单:
JavaScript
var debug = require(‘debug’)(‘app’)
debug(’Hello, %s!’, ‘world’)
// app.jsvar debug = require(‘debug’)(‘app’)debug(’Hello, %s!’, ‘world’)
为了启动调试行,将环境变量 DEBUG 设置为 “app” 或 “*”,就能简单地运行这些代码了:
JavaScript
DEBUG=app node app.js
DEBUG=app node app.js
错误 #10:不使用管理程序
不管你的 Node.js 代码运行在生产环境还是本地开发环境,一个监控管理程序能很好地管理你的程序,所以它是一个非常有用并值得拥有的东西。开发者设计和实现现代应用时常常推荐的一个最佳实践是:快速失败,快速迭代。
如果发生一个意料之外的错误,不要试图去处理它,而是让你的程序崩溃,并有个监控者在几秒后重启它。管理程序的好处不止是重启崩溃的程序。这个工具允许你重启崩溃的程序的同时,也允许文件发生改变时重启程序。这让开发 Node.js 程序变成一段更愉快的体验。
有很多 Node.js 可用的管理程序。例如:
所有这些工具各有优劣。一些有利于在同一个机器里处理多个应用程序,而其它擅长于日志管理。然而,如果你想开始使用这些程序,它们都是很好的选择。
正如你所知道的那样,一些 Node.js 问题能对你的程序造成毁灭性打击。而一些则会在你尝试完成最简单的东西时,让你产生挫败感。尽管 Node.js 的开发门槛较低,但它仍然有很容易搞混的地方。从其它编程语言转过来学习 Node.js 开发者可能会遇到这些问题,但这些错误在 Node.js 新手中也是十分常见的。幸运的是,它们很容易避免。我希望这个简短指导能帮助 Node.js 新手写出更优秀的代码,并为我们开发出稳定高效的软件。
打赏支持我翻译更多好文章,谢谢!
打赏支持我翻译更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
关于伯乐前端
伯乐前端分享Web前端开发,包括JavaScript,CSS和HTML5开发技术,前端相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 oppor11 的文章

 

随机推荐