当前位置:首页 > 休闲

nodejs菜鸟教程

装完 Node.js 之后,菜鸟打开终端敲下 node -v,教程看到版本号跳出来,菜鸟这事就算成了。教程但很多人卡在下一步:写了个 console.log('hello'),菜鸟然后呢?教程文件存成 app.js,命令行里 node app.js,菜鸟屏幕上打印出那行字。教程就这么简单,菜鸟你已经跑起了第一个 Node 程序。教程

Node 的菜鸟本质是把 Chrome 的 V8 引擎拆出来,让它能在服务器上跑 JavaScript。教程以前 JS 只能窝在浏览器里操作 DOM,菜鸟现在它能读写文件、教程开网络端口、菜鸟连数据库。这个转变带来的直接后果是:前端开发者不用换语言就能写后端。我第一次用 Node 写了个小爬虫,那种“同一套语法打通前后端”的感觉确实挺爽。

模块系统:require 和 module.exports

Node 里每个文件就是一个模块。你想用别的文件里的东西,就得 require 进来。比如你写了个 tools.js:

function add(a, b) {  return a + b; } module.exports = {  add }; 

然后在 app.js 里:

const tools = require('./tools'); console.log(tools.add(1, 2)); // 3 

注意路径前面的 ./,漏掉它 Node 会去 node_modules 里找,然后报错 Cannot find module。这个坑我踩过不止一次。另外,module.exports 和 exports 指向同一个对象,但如果你直接给 exports 赋值,它就断开了和 module.exports 的联系,导出会失败。记不住就统一用 module.exports,省心。

npm:装包和 package.json

Node 自带 npm。你在项目目录下执行 npm init -y,会生成一个 package.json,记录项目信息和依赖。想装个 Express?npm install express,几秒钟后 node_modules 文件夹就多了一堆东西。别去手动改 node_modules 里的文件,下次 npm install 全给你覆盖掉。

package.json 里的 dependencies 和 devDependencies 要分清楚。前者是运行时需要的,比如 Express、Mongoose;后者是开发时才用的,比如 nodemon、eslint。装开发依赖加 -D 参数:npm install nodemon -D。上线的时候服务器上跑 npm install --production,devDependencies 就不会被装,省时间省空间。

异步:回调、Promise、async/await

Node 最让人头疼也最核心的就是异步。读个文件:

const fs = require('fs'); fs.readFile('data.txt', 'utf8', (err, data) => {  if (err) throw err; console.log(data); }); console.log('这行先执行'); 

输出顺序是先打印“这行先执行”,再打印文件内容。因为 readFile 是异步的,主线程不等它。回调套回调写多了就是“回调地狱”,代码往右缩进得没法看。后来有了 Promise,再后来有了 async/await,写异步像写同步一样:

const fs = require('fs').promises; async function readData() {  try {  const data = await fs.readFile('data.txt', 'utf8'); console.log(data); } catch (err) {  console.error(err); } } readData(); 

实际项目里我基本只用 async/await,回调只在一些老库的 API 里还会碰到。

起个 HTTP 服务

不装任何框架,用原生 http 模块就能起服务:

const http = require('http'); const server = http.createServer((req, res) => {  res.writeHead(200, {  'Content-Type': 'text/plain' }); res.end('hello node'); }); server.listen(3000, () => {  console.log('跑在 3000 端口'); }); 

浏览器访问 localhost:3000 就能看到那行字。但实际开发没人这么裸写,路由、中间件、静态文件处理都得自己搞。所以 Express 这类框架才流行。不过理解原生 http 模块有助于你明白 Express 到底帮你做了什么。

Node 的生态庞大到有点吓人,npm 上几百万个包。刚开始别贪多,把文件读写、http 服务、npm 基本操作、async/await 这几样练熟,就能写点小工具了。遇到报错先看错误信息,Node 的报错通常挺直白,告诉你是哪个文件哪一行出了什么问题。多跑、多改、多看文档,比看十篇教程管用。

分享到: