面试官问你关于node的那些事(基础篇)
前沿 文章的起源 是树酱的朋友在最近面试中对部分岗位中对node掌握程度要求感到很“慌 ” 当然node已渐渐从很多公司招聘的“加分项”转变为“强指标” “慌”的原因无非是因为平时项目无需用到或者说少用node 再加上我们的知识吸收 大多都是碎片化的知识拼接起来 缺少一个完整体系化的梳理 借此机会 重新梳理一下 当然更多的还需要你参与实战 本文是基础篇。
❞提问 最近Deno很火 会不会替代node的替代品 学node是不是没有前途
❞莫慌 Node依旧是社区热捧的服务器端 JavaScript 运行环境 Deno的出现其实本质上是完善现阶段的Node 新轮子 ,包括原生支持TS、安全性、支持ES Module浏览器模块、等特征。万变不离其宗 虽然有了Deno 将来可能就不需要 Node.js 但是新事物总是需要不断推演和考验后 所以这一点而言 Node短时间内很难被替换 毕竟背后依附着强大社区的支撑
关于 Deno 更多了解 你可以看
通过一些node常见的问题跟你聊聊一些基本知识
❞答案是 process.argv。process是一个全局变量 它提供当前 Node.js 进程的有关信息 而process.argv 属性则返回一个数组 数组中的信息包括启动Node.js进程时的命令行参数
❞举个场景 我们需要在script定义一个node的命令 然后执行改文件后获取不同的参数
拓展 为什么splice(2) 让我们看看其他参数的数值
❞关于获取命令行传来的参数还可以结合commander的 commander.parse(process.argv);
❞答案是 Node 中的文件路径有 __dirname, __filename, process.cwd(), ./ 或者 ../下面用一个例子来介绍这几种文件路径的区别
❞先看看我们当前运行的目录的结构
KSDK/ -src/ -test.js
在 test.js 里写下如下的code
然后分别在src下运行和KSDK下运行对比下结果如何
对比看到 只有我们后两者产生变化 可以得出如下结论
答案 path 模块提供了一些实用工具 用于处理文件和目录的路径 常用api有 path.dirname、path.join、path.resolve 其他的看文档 Path API
❞我们用个简单的demo来区分
我们看到path.join(__dirname, ../lib/common.js )和 path.resolve(__dirname, ../lib/common.js )返回的结果相同 难道可以相互替换 你在看下面这个例子 你或许会清晰些
❞路径还是上面演示的路径
path.join( /a , /b ) // /a/b path.resolve( /a , /b ) // /b
path.join( a , b ) // a/b path.resolve( a , b ) // /Users/tree/Documents/infrastructure/KSDK/src/a/b
答案 通过fs文件系统模块提供的API 也是node中重要的模块之一 fs模块主要用于文件的读写、移动、复制、删除、重命名等操作。
❞通过一个简单的重命名apirename使用 之前在做脚手架中使用到
⏰需要注意的是 使用require( fs )载入fs模块 fs模块中所有方法都有同步和异步两种形式,刚刚我们展示的rename是异步方法的调用 因为在繁忙的进程中 应使用异步方法 同步的版本会阻塞整个进程 停止所有的连接 当然fs.rename对应的同步方法就是fs.renameSync
❞下面我们看一个同步方法的演示 判断文件是否存在
还有一点要注意的是 无论同步异步尽量对抛出的异常做相应的处理
❞答案是 用来对url的字符串解析、url组成等功能 主要包括以下几个API。url.parse()、url.format()
❞以url.parse作为例子
解析出来结果
Url { protocol: http: , slashes: true, auth: null, host: baidu.com:8080 , port: 8080 , hostname: baidu.com , hash: #node , search: ?query js , query: query js , pathname: /test/h , path: /test/h?query js , href: http://baidu.com:8080/test/h?query js#node }
答案是 express是一个服务端框架,框架简单封装了node的http模块,express支持node原生的写法,express不仅封装好服务器 还封装了中间件、路由等特征 方便开发web服务器 换句话说express http模块 中间件 路由
❞先看看http模块是如何实现一个简单的服务器
运行3000端口 即可访问到浏览器打印出hello node.js
接下来看看express如何实现
以上就实现一个简单的服务端逻辑 包含中间件、路由设置
答案 中间件 app.use方法就是往中间件队列中塞入新的中间件 express中间件处理方式是线性的 next过后继续寻找下一个中间件 当然如果没有调用next()的话 就不会调用下一个函数了 调用就会被终止
❞我们看下koa2下面这个简单的例子 你可以对比下Express的实现
看看输出的日志
答案是 模板引擎是一个通过结合页面模板、要展示的数据生成HTML页面的工具 本质上是后端渲染 SSR 的需求 加上Node渲染页面本身是纯静态的 当我们需要页面多样化、更灵活 我们就需要使用模板引擎来强化页面 更好的凸显服务端渲染的优势
❞常见主流模版引擎有
未完待续...
面试官问你关于node的那些事(进阶篇) 前沿:续上次面试官问你关于node的那些事基础篇发出,童鞋反馈说“怎么那么基础啊,这也太水了吧” 这里统一做回复,不基础咋叫“基础篇”呢,因为树酱也不是什么大神,渣渣来着,只是通过自己的角度,希望能帮助大家更好地去学习,于是就有了进阶篇的梳理计划,今天树酱继续跟你聊聊关于node后续的那些事,附上 面试官问你关于node的那些事(普通篇)
Node 模块机制不完全指北 Node 中采用了 CommonJs 规范,通过 module.exports 和 require 来导出导入模块。在模块加载机制中,Node 采用延迟加载的策略,只有到使用到时,才会去加载,加载之后会被存入 cache 中。
图解Node.js流行趋势,Node在路上 尽管Node.js只出来了四年,但是他是GitHub上面第二热的项目。 自从2013年3月11日发布v0.10以后,每天平均的下载量有35,000次。 nodejs.org的v0.10独立版本已经有超过100万的下载次数。 目前已经有253次以Node.js为主题的讨论。