查看一下 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
中暴露出去的模块。
{
"main": "lib/index.js",
}
npm script(重)
"scripts": {
"test": "test.js"
"build": "tsc",
},
比如:test 命令对应的脚本是 node test.js, 在命令行中使用 npm run key(命令),就可以执行这段脚本。
直接执行: npm run
可以查看项目中所有 npm 脚本命令。
钩子(生命周期)
其实 package.json
中的 script
也是有生命周期的。npm
脚本有两个钩子,pre
和 post
,当我们执行start
脚本时候,start
的钩子就是 prestart
和 poststart
。
npm run prestart && npm run start && npm run poststart
所以 在实际开发当中,我们可以做一些 准备或者清理工作。
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build": "cross-env NODE_ENV=production webpack"
执行顺序
npm
脚本执行多任务分为两种情况
- 并行任务(同时的平行执行),使用&符号
npm run script1.js & npm run script2.js
- 串行任务(前一个任务成功,才执行下一个任务),使用 && 符号
npm run script1.js && npm run script2.js
npm 包发布
标准的 npm 模块目录
基于 CommonJS 模块化规范实现的,除了 描述文件 package.json 以外还需要包含一下目录:
- bin: 存放可执行 二进制文件的目录
- lib: 存放 js 代码的目录
- doc:存放文档的目录
- test: 存放单元测试用例代码的目录
如何写好你的 README
推荐: 链接
发布自己的 npm 包
- 先去注册账号,然后 执行命令: npm adduser #根据提示输入用户名密码即可
- 使用命令发布自己的包: npm publish
记得 配置一个 .npmignore 文件来排除垃圾文件。可以直接 复制 .gitignore
3. 发布成功之后,就可以使用了: npm install xxxxx
- 关于 npm 包更新
# 升级补丁版本号
$ npm version patch
# 升级小版本号
$ npm version minor
# 升级大版本号
$ npm version major
先更改版本号然后,再次执行 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 模块
- util.promisify(fn); //十分常用
- util.inherits(Child, Parent);
- util.isArray([]) util.isString();
path 简化路径相关操作,并提升代码可读性
- path.resolve([…paths]):方法将一系列路径或路径段解析为绝对路径。
- path.basename(path[, ext]):该方法返回路径的最后一部分。目录分隔符”/“会被自动忽略。
path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'
path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux'
http 提供两种使用方式
- 作为服务端使用时,创建一个 HTTP 服务器,监听 HTTP 客户端请求并返回响应。
- 作为客户端使用时,发起一个 HTTP 客户端请求,获取服务端响应。
二、中间层 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中间层的优势
功能分离,减轻板块负担;
- 跨系统、跨终端均可重用页面数据校验、逻辑代码,无需因为新系统、终端的接入而重写校验;
- 只在中间件中做一次数据校验,避免了前端做数据校验的同时后端也要做校验的重复,在有效保证数据的有效性的同时降低了团队整体的工作量;
- 处理数据逻辑,解放了前端既要做页面渲染又要写复杂的逻辑,使得页面开发人员专注于页面渲染,不仅使得分工更为明确,项目协作效率更高,更重要的是快速响应页面使得页面加载更快,用户体验更好,避免了浏览器长时间显示空白页面的不友好体验,真正的前后端分离。