- 前言
首先, 很感谢「 若川 」 大佬 提供的 一个「 源码共读 」 平台, 其实我很早就进入了,但是因为做为一个奶爸, 下班后马不停蹄地回家带娃, 所以很少有时间参与 源码共读 的活动来。
今天正好抽出时间,参与一下大佬的新一期的活动, 这一期项目是 validate-npm-package-name, 它是检验一个字符串是否是一个 有效的 包命名
- 学习目标
- 了解 validate-npm-package-name 的作用和使用场景
- 工具介绍
Give me a string and I’ll tell you if it’s a valid
npm
package name.
This package exports a single synchronous function that takes astring
as input and returns an object with two properties:validForNewPackages
::Boolean
validForOldPackages
::Boolean
接受一个字符串参数, 检验该字符串是否是一个有效的包命名,
该工具 提供一个 接受字符串的函数, 并且返回 一个拥有2个属性的对象validForNewPackages
::Boolean
validForOldPackages
::Boolean
- 包命名规则
- 包名不能是空字符串;
- 所有的字符串必须小写;
- 可以包含 连字符 - ;
- 包名不得包含任何非 url 安全字符;
- 包名不得以 . 或者 _ 开头;
- 包名首尾不得包含空格;
- 包名不得包含 ~)(‘!* 任意一个字符串;
- 包名不得与node.js/io.js 的核心模块 或者 保留名 以及 黑名单相同;
- 包名的长度不得超过 214;
- 示例
5.1 有效的包名
1 | js复制代码var validate = require("validate-npm-package-name") |
5.2 无效的包名
1 | js复制代码// 包含 不符合 第6条 规则 |
- 源码阅读
6.1 代码结构
1 | js复制代码var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$') |
6.1.1 scopedPackagePattern 正则表达式
var scopedPackagePattern = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$'
正则表达式可视化, 链接地址:jex.im/regulex/
匹配以下字符串
- @user 以@开头
- @user/test
- 非‘/’的字符串
builtins:列出了 node 所有的内置模块
6.1.2 validate函数, 结合 [包命名规则]
(1)检测传入的参数是否是字符串;
1 | js复制代码if (name === null) { |
(2)包名不能是空字符串
1 | js复制代码if (!name.length) { |
(3)包名不得以 . 或者 _ 开头
1 | js复制代码if (name.match(/^\./)) { |
(4) 包名首尾不得包含空格
1 | js复制代码// trim 方法 可以去掉 字符串 两边的 空白 |
(5) 包名不得与node.js/io.js 的核心模块 或者 保留名 以及 黑名单相同
1 | js复制代码// No funny business |
(6)包名的长度不得超过 214
1 | js复制代码// really-long-package-names-------------------------------such--length-----many---wow |
(7)所有的字符串必须小写
1 | js复制代码// mIxeD CaSe nAMEs |
(8)包名不得包含 ~)(‘!* 任意一个字符串
1 | js复制代码if (/[~'!()*]/.test(name.split('/').slice(-1)[0])) { |
(9)包名不得包含任何非 url 安全字符
1 | js复制代码const regx = new RegExp('^(?:@([^/]+?)[/])?([^/]+?)$') |
1 | js复制代码if (encodeURIComponent(name) !== name) { |
6.2 done 函数
1 | js复制代码var done = function (warnings, errors) { |
- 总结
整个项目并不是太难, 都是一些基本的字符串判断,以及正则匹配,但是值得每个人去学习, 在编写一个工具的时候, 保证代码的逻辑清晰, 代码的书写规范。
本文转载自: 掘金