源码共读活动:第7期 | validate-npm-package-name 检测 npm 包是否符合标准
仓库:validate-npm-package-name
正则表达式可视化:Regulex
一、介绍
1.1 概念
1 | Give me a string and I'll tell you if it's a valid npm package name. |
1 | 谷歌翻译: |
从概念中可以看出,validate-npm-package-name是用来校验npm包命名是否合法的一个工具。
ps:只有在包名合法有效的时候,返回的对象只有validForNewPackages、validForOldPackages两个属性。当包名存在问题时,返回的对象中还会有erros或者warnings。
1.2 命名规则
1 | Below is a list of rules that valid npm package name should conform to. |
1 | 以下是npm包命名规则列表: |
1.2.1 有效包名
1 | var validate = require("validate-npm-package-name") |
以上包名都是有效的,所以会返回以下这个对象:
1 | { |
1.2.2 无效包名
1 | validate("excited!") |
以上包名无效,所以会返回以下对象:
1 | { |
1.3 以前的包名
在以前,npm包命名随意,可以有大写字母,包名可能很长,也有可能是已经存在的包名。
在现在,如果给validate输入一个在以前算是有效的包名,会看到 validForNewPackages 属性的值发生变化,并且会出现一个警告数组:
1 | validate("eLaBorAtE-paCkAgE-with-mixed-case-and-more-than-214-characters-----------------------------------------------------------------------------------------------------------------------------------------------------------") |
以上函数返回:
1 | { |
二、源码分析
2.1 源码
源码总共105行,算是偏少的,易于学习~
1 |
|
2.2 分析
2.2.1
1 | var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$') |
仓库:builtins
源码中用到了builtins,builtins在之后的源码中,用来判断包名是否与当前 Node.js 版本的核心模块相同。
在此罗列一下核心模块:
1 | var coreModules = [ |
2.2.2
注释“校验代码”部分主要是判断包名是否有效的代码,暂时先省略,在之后再分析,先分析其他部分。
1 | var validate = module.exports = function (name) { |
在介绍概念的时候提到过,validate函数返回的对象有两个属性,值均为布尔值:validForNewPackages和validForOldPackages。warnings和errors两个数组根据其长度是否为0,确定是否存在。
在return的done函数中,对以上几个属性赋值并返回对象。其中validForNewPackages用来判断一个包名是否合法,validForOldPackages主要是为了兼容以前包名不规范时定下的包名。
2.2.3 errors
在执行到if判断里的“return done(warnings, errors) ”时,valid函数便会执行结束,不再执行之后的if判断,提高效率。
1、校验包名是否是字符串
1 | if (name === null) { |
2、校验包名是否是合法的字符串
1 | // 不能是空字符串 |
2.2.4 warnings
1 | // Generate warnings for stuff that used to be allowed |
2.2.5 包名只能包含URL安全字符
1 | var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$') |
三、心得
虽然知道源码学习很重要,但平时因为工作忙或者懈怠,源码看的比较少,刚好碰到了“源码共读”这个活动,开始系统地看源码,希望能坚持下去,coding能力up up up!
根据推荐的学习顺序, validate-npm-package-name的源码还是十分友好的,学习到了一些知识还有写代码风格,是个好的开始。
学习文章: