查看一下 npm 当前版本 npm -v

npm 更新到最新版本: npm install npm@latest -g

如果想更新到指定版本 npm -g install npm@2.9.1 (@后跟版本号),

输入以下命令,切换到淘宝镜像源:

npm install -g cnpm —registry=http://registry.npm.taobao.org

之后所有用到的 npm 命令都可以使用 cnpm 来代替进行 install。但是 cnpm 不支持 publish 命令,需要注意。
关于淘宝 npm 镜像的其他使用问题,请参考: https://npm.taobao.org/

Node.js 环境搭建

npm init

执行 npm init 的时候,会有一个初始化 pacakge.json 过程,然后一路回车,其实可以直接使用 npm init --yes 在命令后追加 --yes 参数即可,

package.json 中的常规属性

dependenices

通过命令 `npm install packageName -S 、npm i packageName --save 把包装在此依赖项里。默认是最新版本,npm i vue@3.0.1 -S 指定版本

npm 5.x开始,可以不用手动添加-S/--save指令

devdependenices

只是在开发环境中使用的到。 npm install -D xxxx

main

main 属性指定程序的主入口文件,其他项目在引用这个 npm 包时,实际上引入的是 lib/index 中暴露出去的模块。

  1. {
  2. "main": "lib/index.js",
  3. }

npm script(重)

  1. "scripts": {
  2. "test": "test.js"
  3. "build": "tsc",
  4. },

比如:test 命令对应的脚本是 node test.js, 在命令行中使用 npm run key(命令),就可以执行这段脚本。

直接执行: npm run 可以查看项目中所有 npm 脚本命令。

钩子(生命周期)

其实 package.json 中的 script也是有生命周期的。npm 脚本有两个钩子,prepost,当我们执行start脚本时候,start 的钩子就是 prestartpoststart

  1. npm run prestart && npm run start && npm run poststart

所以 在实际开发当中,我们可以做一些 准备或者清理工作。

  1. "clean": "rimraf ./dist && mkdir dist",
  2. "prebuild": "npm run clean",
  3. "build": "cross-env NODE_ENV=production webpack"

执行顺序

npm 脚本执行多任务分为两种情况

  • 并行任务(同时的平行执行),使用&符号
  1. npm run script1.js & npm run script2.js
  • 串行任务(前一个任务成功,才执行下一个任务),使用 && 符号
  1. npm run script1.js && npm run script2.js

npm 包发布

标准的 npm 模块目录

基于 CommonJS 模块化规范实现的,除了 描述文件 package.json 以外还需要包含一下目录:

  • bin: 存放可执行 二进制文件的目录
  • lib: 存放 js 代码的目录
  • doc:存放文档的目录
  • test: 存放单元测试用例代码的目录

如何写好你的 README

推荐: 链接

发布自己的 npm 包

  1. 先去注册账号,然后 执行命令: npm adduser #根据提示输入用户名密码即可
  2. 使用命令发布自己的包: npm publish

记得 配置一个 .npmignore 文件来排除垃圾文件。可以直接 复制 .gitignore
3. 发布成功之后,就可以使用了: npm install xxxxx

  • 关于 npm 包更新
  1. # 升级补丁版本号
  2. $ npm version patch
  3. # 升级小版本号
  4. $ npm version minor
  5. # 升级大版本号
  6. $ npm version major
  7. 先更改版本号然后,再次执行 npm publish来发布。

本地开发的 npm 包如何调试

在本地开发的模块包的时候,可以使用 npm link 调试,将模块链接到对应的运行项目中去,方便地对模块进行调试和测试。具体使用步骤如下

  • 假如我的项目是 koalaNpmStudy,假如我的 npm 模块包名称是 npm-ikoala
  • 进入到 模块包 npm-ikoala 目录中,执行 npm link
  • 在自己的项目 koalaNpmStudy 中创建连接执行 npm link npm-ikoala
  • 在自己项目的 node_module 中会看到链接过来的模块包,然后就可以像使用其他的模块包一样使用它了。
  • 调试结束后可以使用 npm unlink 取消关联

    npm link 主要做了两件事: 为目标 npm 模块创建软链接,将其链接到全局 node 模块安装路径 /usr/local/lib/node_modules/。 为目标 npm 模块的可执行 bin 文件创建软链接,将其链接到全局 node 命令安装路径 /usr/local/bin/。

Node.js 常用模块

Global 模块

全局共享的不需要导入模块 即可使用。
常用的属性:
dirname : 文件所在的文件夹路径
filename : 文件所在的路径
require() : 导入需要的模块
module : 自定义模块时用到
exports : 自定义模块时用到

fs 文件操作模块

fs 模块的常见方法(所有的读方法,文件必须存在,不存在就会报错,所有的写方法,如果文件不存在,则创建该文件):

util 模块

  1. util.promisify(fn); //十分常用
  2. util.inherits(Child, Parent);
  3. util.isArray([]) util.isString();

path 简化路径相关操作,并提升代码可读性

  • path.resolve([…paths]):方法将一系列路径或路径段解析为绝对路径。
  • path.basename(path[, ext]):该方法返回路径的最后一部分。目录分隔符”/“会被自动忽略。
  1. path.basename('/foo/bar/baz/asdf/quux.html');
  2. // Returns: 'quux.html'
  3. path.basename('/foo/bar/baz/asdf/quux.html', '.html');
  4. // Returns: 'quux'

http 提供两种使用方式

  • 作为服务端使用时,创建一个 HTTP 服务器,监听 HTTP 客户端请求并返回响应。
  • 作为客户端使用时,发起一个 HTTP 客户端请求,获取服务端响应。

《Koa2 进阶学习笔记》已完结

二、中间层 BFF 的意义

Node.js是一个Javascript运行环境。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。Node.js是单进程、单线程运行机制,通过事件轮询(event loop)来实现并发操作,而且性能很好。

Node.js最大的改良架构就是”增加了中间层”,前后端分离,使用Node.js来做‘BBF(backend of frontend)’在传统后端加入了Node.js这一层,
通过此有两点好处:

  • 前端接管了view层,后端渲染也开始全部由前端掌控。
  • 另一个就是接口层增加了一层,在前后端分离的天然选择下,Node.js中间层可以承担更多的责任。

    1、Node.js中间层可做的工作

  • nodejs 中间层可以缓解前后端的关系,因为后端给的数据有可能前端用不到,或者不够前端用。所以夹着nodejs,前端可以拿到自己想要的数据,后端也不影响。

  • 代理:在开发环境下,我们可以利用代理来,解决最常见的跨域问题;在线上环境下,我们可以利用代理,转发请求到多个服务端。
  • 缓存:缓存其实是更靠近前端的需求,用户的动作触发数据的更新,Node.js中间层可以直接处理一部分缓存需求。
  • 限流:Node.js中间层,可以针对接口或者路由做响应的限流。
  • 日志:相比其他服务端语言,Node.js中间层的日志记录,能更方便快捷的定位问题(是在浏览器端还是服务端)。
  • 监控:擅长高并发的请求处理,做监控也是合适的选项。
  • 鉴权:有一个中间层去鉴权,也是一种单一职责的实现。
  • 路由:前端更需要掌握页面路由的权限和逻辑。
  • 服务端渲染:Node.js中间层的解决方案更灵活,比如SSR、模板直出、利用一些JS库做预渲染等等。

    2、Node.js中间层带来的好处

  • 通过PC Web自己的中间层,可以按照业务定制化接口,扩大前端展现的能力和范围;

  • 中间层接口由使用接口的前端工程师开发,对展现和接口的功能更加熟悉,避免了以前的工作模式中接口方跟各方的需求对接、沟通、联调时间,这样使得项目的推进更加顺利,项目迭代会更快;
  • 中间层使用NodeJS,开发语言是JavaScript,跟现在前端工程师的工作语言一样,减少了学习成本;
  • 中间层接口的开发由前端工程师同时负责开发,既节省了人力成本,同时又提高了前端开发人员的技术能力,使得前端工程师向全栈工程师迈进。

    3、Node.js中间层的优势

  • 功能分离,减轻板块负担;

  • 跨系统、跨终端均可重用页面数据校验、逻辑代码,无需因为新系统、终端的接入而重写校验;
  • 只在中间件中做一次数据校验,避免了前端做数据校验的同时后端也要做校验的重复,在有效保证数据的有效性的同时降低了团队整体的工作量;
  • 处理数据逻辑,解放了前端既要做页面渲染又要写复杂的逻辑,使得页面开发人员专注于页面渲染,不仅使得分工更为明确,项目协作效率更高,更重要的是快速响应页面使得页面加载更快,用户体验更好,避免了浏览器长时间显示空白页面的不友好体验,真正的前后端分离。