做为包管理器,npm
在前端开发过程当中使用频率很高,不过大部分前端可能只使用过npm install
等简单的功能。今天这篇文章主要介绍一些进阶的知识点,分为两个部分,第一个部分是从npm
包开发者的角度讲解怎么发布和管理本身的包。而第二部分是从使用者的角度,介绍怎么使用npm
工具进行流程自动化,从而让前端开发过程更流畅和高效。但愿对你们有帮助。html
咱们能够将开发者大体分为两类,一类是使用轮子的,而另外一类就是造轮子的。有时候开发业务的前端也须要本身造轮子,那么就须要可以发布和管理本身的前端工具包。前端
要发布本身的npm
包的话,首先要到npm官网注册一个帐号。若是你使用的是企业私有的仓库,那可能就须要到管理员那里申请一个帐号。node
有了这个帐号后,使用npm login
命令进行登陆:linux
如今准备咱们要上传的代码,先新建一个用于开发npm
包的项目:webpack
mkdir npm-test
cd npm-test
npm init
复制代码
接着就是写代码,并准备好一个良好的说明文件(README.md
)。web
作完准备工做后,就能够执行命令进行发布了:npm
npm publish
复制代码
后续要更新只要在package.json
里修改对应的版本号,而后再执行npm publish
命令就能够了。json
npm包的版本号遵循着必定的规范,好比1.5.2
这个版本号,其中1
是主版本号(major version),5
是次版本号(minor version),而 2
是补丁版本号(patch version),主要用来bug修复的更新等。在包管理的时候遵循对应语义的版本号更新,便于后续维护。缓存
同时,在发布一个新版本的时候,还可使用打标签的方式进行标记,如:安全
npm publish --tag beta
npm publish --tag bugfix
复制代码
若是你的包是已经发布过了,还能够对指定的版本号进行打标签:
npm dist-tag add npm-test@1.0.0 [stable]
复制代码
有时候你须要同时发布多个包,并且这些包之间有着从属关系。这时候,你能够考虑将它们放在同一个域(scope)下面进行管理。就像咱们日常使用@material
包同样,全部的scope包都会有一个域名,在初始化包的使用如下命令:
npm init --scope=@scq000test
复制代码
这样咱们就建立了从属于这个域的包了。默认状况下,这样发布的包是私有的,若是要发布到公网上,必须指定对应的权限,能够执行以下命令进行发布:
npm publish --access public
复制代码
这样一来,在后续使用过程当中只要执行npm install @scq000test
就会批量安装全部以@scq000test
做为域的包了。
通常在写完代码以后,都有必要进行安全检测,以确保代码中引用的其它npm
包都是符合安全规范的。要作到这一点能够利用官方提供的npm audit
命令进行处理。
当咱们执行npm install
来安装依赖包的时候,默认状况npm
也会执行安全审查的操做。可是若是咱们想要更详细的审查信息就须要执行命令npm audit
进行查看。
若是发现安全报告中有可疑项,可使用命令:
npm audit fix
复制代码
进行自动修复。修复完成后,若是还有问题,就须要仔细分析引用包的风险,再考虑手动修复或者换包。
利用缓存是提升安装速度的一种颇有效的方式。不过有时候npm缓存也很容易形成一些麻烦,若是你在项目使用过程中一旦怀疑是缓存影响了代码的正常工做,可使用npm cache verify
这个命令验证缓存信息。
另外,还可使用命令npm cache clean
用来清理缓存,当代码有问题的时候,这个命令也十分经常使用。
提升开发效率在日常的工做中是十分重要的,由于对于可以自动化执行的操做耗费精力是不值得的。那么在前端开发过程中有哪些小技巧可以有效地帮助咱们提升平常工做效率呢?
这里推荐使用npm脚本
。
前端工做流当中很重要的一个部分就是使用自动化脚本进行构建,想必你们日常使用最多的实际上是npm start
这个命令。其实除了这个比较经常使用的命令以外,咱们还可以作一些更深刻的挖掘。若是你可以把一个经常使用的任务拆分红许多子任务的话,那么在后期维护和管理的过程中就能更有效率。
好比,在作前端项目的测试的时候,一般能够将任务分为单元测试,端对端测试和集成测试。借助npm run all这个工具就可以批量执行测试脚本:
{
"scripts": {
"test:unit": "jest unit/*.spec.js",
"test:e2e": "jest e2e/*.spec.js",
"test:integrate": "jest integrate/*.spec.js",
"test": "npm-run-all test:* --parallel"
}
}
复制代码
这样一来,只须要执行npm run test
这一条命令,就能同时执行全部的测试任务。
另一个例子就是咱们经常还须要注意不一样操做系统上兼容性问题。可能你写的一些npm脚本并不可以很好地在多个操做系统上都工做。这时候你就须要花一些时间去调试这些脚本,或者是找到所对应的跨平台的解决方案,再或者说能够利用工具run-script-os来针对不一样的操做系统写脚本:
{
"scripts": {
"test": "run-script-os",
"test:win32": "echo 'del whatever you want in Windows 32/64'",
"test:darwin:linux": "echo 'You can combine OS tags and rm all the things!'",
"test:default": "echo 'This will run on any platform that does not have its own script'"
}
}
复制代码
不少Linux环境下的经常使用命令在node.js端也已经有现成的工具,咱们能够很方便地拿来就用。下面是一些在实际开发当中用的比较多的一些npm包以及它们所对应的Linux命令:
linux命令 | 对应的npm包 |
---|---|
bash | node |
cat | catw |
rm | rimraf |
mkdir | mkdirp |
还有一个注意事项是,在写脚本过程中,咱们不该该过分地依赖node_module
这个目录,而应该使用一个比较通用的路径名称,以便在其余开发者的电脑上也可以正常的使用咱们写的npm
脚本。下面这个例子就不是一个很好的实践,由于在他人的电脑上可能失效:
{
"scripts": {
"test": "./node_modules/.bin/jest ./index.spec.js"
}
}
复制代码
咱们最好将其改为下面这样:
{
"scripts": {
"test": "jest ./index.spec.js"
}
}
复制代码
npm提供了强大的生命周期钩子,pre
和post
。经过前置和后置钩子可让将环境准备和清理的工做从主任务中拆分出来。
{
"scripts": {
"prebuild": "npm install",
"build": "cross-env NODE_ENV=production webpack",
"postbuild": "rimraf ./dist"
}
}
复制代码
npm已是前端开发的一个核心工具了,利用好官方提供的一些高级功能可以极大地提升咱们开发的效率。若是你是npm包的开发者,那么就须要理解整个发布流程和版本号更新的策略。而做为使用者,须要掌握npm scripts的编写,让开发体验更加顺畅。
——转载请注明出处———
微信扫描二维码,关注个人公众号
最后,欢迎你们关注个人公众号,一块儿学习交流。