{"id":21944110,"url":"https://github.com/wangxiaoyugg/learn-nodejs","last_synced_at":"2026-04-12T15:41:23.500Z","repository":{"id":113232411,"uuid":"107743143","full_name":"WangXiaoyugg/learn-nodejs","owner":"WangXiaoyugg","description":"learning notes about NodeJs ,easy tutorial","archived":false,"fork":false,"pushed_at":"2017-10-28T12:12:11.000Z","size":4985,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-27T16:48:17.329Z","etag":null,"topics":["easy","learning-notes","nodejs","tutorial"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WangXiaoyugg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-21T01:52:52.000Z","updated_at":"2017-10-25T00:22:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"a60e8e68-6100-4df0-bde5-e3900a1d9e60","html_url":"https://github.com/WangXiaoyugg/learn-nodejs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Flearn-nodejs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Flearn-nodejs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Flearn-nodejs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WangXiaoyugg%2Flearn-nodejs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WangXiaoyugg","download_url":"https://codeload.github.com/WangXiaoyugg/learn-nodejs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244982060,"owners_count":20542300,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["easy","learning-notes","nodejs","tutorial"],"created_at":"2024-11-29T04:13:37.670Z","updated_at":"2026-04-12T15:41:18.470Z","avatar_url":"https://github.com/WangXiaoyugg.png","language":"HTML","readme":"# learn-nodejs\n\n### 学习目标\n\n学会NodeJs的基本使用\n\n- NodeJs 是什么，相对优势\n- 项目代码的调试和初始化\n- 基础的常用API\n- 开发一个简易的Web static server\n- 单元测试 发布\n- 开发一个简易的 NodeJs 爬虫\n\n#### NodeJSNodeJs 是什么\n- Node.js is a JavaScript runtime built on Chrome's V8\n- Node.js use an event-driven , non-blocking I/O model\n\n##### 非阻塞I／O\n- 阻塞: I/O 时进程休眠时等待I／O 完成后进行下一步\n- 非阻塞： I／O 时函数立即返回，不用等待进程I／O 完成\n- I/O 操作非常耗时，耗性能\n\n##### 事件驱动\n- I/O 等异步操作结束后通知\n- 观察者模式\n\n#### 为什么使用前端偏爱NodeJs\n- 前端的职能范围扩大，统一开发经验\n- 处理高并发、I／O 密集场景性能优势明显(web 开发)\n\n##### cpu 密集 I/O 密集\n- cpu密集 压缩 解压 加密 解密\n- I／O 密集 文件操作 网络操作 数据库操作\n\n##### web 常见场景\n- 静态资源读取\n- 数据库操作\n- 渲染页面\n\n##### 高并发解决方式\n- 增加机器数\n- 增加每台机器的CPU数 - 多核\n\n##### 进程\n- 计算机的程序关于某数据集合上的一次运行活动，是系统进行资源分配和调度的基本单位\n- 多进程： 启动多个进程，多个进程可以执行多个任务\n\n##### NodeJs 工作模型\n```\nclient =\u003e     ----------------\nclient =\u003e     |             |\nclient =\u003e     |EventLoop    |   =\u003e Non-blocking Worker(C++ thredpool)\nclient =\u003e  \u003c= |single thread|   \u003c======\n              ----------------   callback\n```\n\n##### 线程\n- 线程是进程内一个相对独立的，可调度的执行单元，与同属一个进程共享进程的资源\n- 多线程 是启动一个进程 ，在一个进程内启动多个线程，多个线程也可以一块执行多个任务\n\n##### NodeJs 单线程\n- 单线程只是针对主进程，I/O操作系统多线程调度\n- 单线程不是单进程\n\n##### 常用场景\n- web Server\n- 本地代码构建(前端)\n- 实用工具开发(性能不一定是最佳)\n\n### 开发环境\n- 官网下载 NodeJS [安装包](http://nodejs.cn/download/) \n- CommonJS \n- global\n- process\n\n###### CommonJS\n```\nconsole.log(1);\n\n(function (exports,require,module,__filename,__dirname) {\n  console.log(1);\n});\n```\n- 每个文件是一个模块，有自己的作用域\n- 在模块内部 module 变量代表模块本身\n- module.exports 属性代表模块的对外接口\n\n##### require 规则\n- / 表示绝对路径 ./表示相对路径\n- 支持 js json node 扩展名文件，不写依次尝试\n- 不写路径则认为是 build-in 模块 或是各级的node_modules 下的模块\n\n##### require 特性\n-  module 被加载的时候执行，加载后缓存\n- 一旦出现某个某块被循环加载，只输出自己已执行的部分，还未执行的部分不会输出\n\n##### global\n- CommonJS\n- Buffer process console\n- timer\n\n#### 调试\n- Inspector\n使用谷歌浏览器调试控制台\nnode --inspect-brk xxx.js\n- VS Code\n- WebStorm\n- 条件调试\n\n##### path模块\n- __diranme ,__filename 总是返回文件的绝对路径\n- process.cwd() 总是返回node 执行命令时的路径\n\n##### ./\n- require 的方法中总是相对当前的文件所在文件夹\n- 在其他地方和 process.cwd() -样，相对node的启动文件夹\n\n#### Buffer\n- 用于处理二进制数据流\n- 实例类似整数数组，大小固定\n- C++代码在V8 在堆外分配物理内存\n\n#### events\n- demo/event.js\n\n#### fs\n- demo/fs.js\n\n#### promise\n- demo/promise.js\n\n#### static Server\n- 功能类似 anywhere\n\n#### .gitignore\n- 前 / 代表项目根目录\n- 后 / 表示目录\n- ! 表示取反\n- * 表示任意字符\n- ？ 匹配一个字符\n- ** 匹配多级目录\n\n#### npmignore\n\n#### editorconfig\n\n#### eslint\n- eslint --init\n- npm scripts\n- pre-commit packages\n\n#### supervisor chalk\n\n#### range\n- range: bytes = [start]-[end]; 超出范围 416 状态码\n- Accept-Ranges:bytes\n- Content-Range:bytes  start-end/total\n\n- curl -r 0-20 -i url\n\n#### 缓存\n用户请求 =\u003e 本地缓存  =\u003e 请求资源  =\u003e 协商缓存/返回响应\n            失败   \n本地缓存(没失效)     \n           server没改变(失效)    =\u003e 协商缓存/返回响应\n           yes\n本地缓存 \u003c= 304\n\n换图片直接改路径\n\n- Expires, Cache-Control\n- If-Modified-Since / Last-Modified\n- If-None-Match / ETag\n          \n          \n#### cli\n- npm i -g anywhere\n\n使用方法\nstaticServer # 把当前文件夹作为静态资源服务器的根目录\nstaticServer -p 8080  # 设置端口号\nstaticServer -h localhost #设置localhost\nstaticServer -d /usr    # 设置根目录为usr \n\n#### 语义化版本号\nx.y.z\nz =\u003e bug fix\ny =\u003e add functions\nx =\u003e new version , it can absolute different form last version\n\nx.y.* \u003c=\u003e ~1.2.0\n2.x \u003c=\u003e ^2.0.0\n\n#### 发布包\n- npmjs.org 注册账号\n- npm login 输入 username/password\n- npm publish\n \n#### git\n- git rm -r --cached . 撤销提交\n\n### 本地构建\n- babel\n- 不能解决依赖\n- Object.assign({a:1},{b:1});是es2015之前的，只支持2015\n  使用plugins:Modules \n  \n### 打包webpack\n- 模块 bundler\n- 官网文档，tutorial\n- 核心概念\n```\nentry: 入口文件（多入口和设置入口的名字）\noutput: 输出的文件\nmodule: {rules:[]} 配置 loader;\nplugins:[];extract-text-webpack-plugin;\nexternals:{jquery:\"jQuery\"};'减少react,react-dom'\nnew webpack.optimize.CommonsChunkPlugin({names:['vendor','runtime']})\nentry:{\n    vendor:['react','react-dom']\n}\ntreeShaking 打包用到的模块 uglifyjs-webpack-plugin\n```\n#### 测试\n- 断言 assert 模块\n- BDD  行为驱动开发 chai \n- TDD  测试驱动开发 chai\n- mocha describe it 可以嵌套\n  语义化非常明显 it.only(),it.skip();  \n- 单元测试 ustanbul 覆盖率\n\n##### 持续集成\n- 频繁将代码集成到主干\n- 每次集成都通过自动化构建测试\n- 尽早发现错误\n- 防止分支大幅偏离主干\n- build:passing coverage:100%(repo-badges)\n- travis-cli\n- library 验证性能更高 bench-mark 性能测试\n- 浏览器 jspref.com\n\n#### UI测试\n- React 组件UI 测试 jest (简单API 测试类似 chai)\n- React jest Dom 测试\n- sinon 包\n- 测试写好的网页 selenium-webdriver\n  [selenium-webdriver](http://seleniumhq.github.io/selenium/docs/api/javascript/)\n  \n#### 爬虫\n- 按照一定规则自动抓取网络信息的程序\n- cherrio + superagent\n- puppeteer\n\n#### 反爬虫\n- User-Agent,Referer,验证码\n- 单位时间访问次数，访问量\n- 关键信息图片混淆\n- 异步加载\n\n##### 空目录上传\n- .gitkeeper\n\n  \n\n     \n           ","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangxiaoyugg%2Flearn-nodejs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwangxiaoyugg%2Flearn-nodejs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwangxiaoyugg%2Flearn-nodejs/lists"}