最近发现有个项目的eslint跑不起来,重点错误信息如下:
大概就是eslint中的某个包有问题,看了下这个项目的配置,发现跟最近一直开发着的项目的配置基本一样,版本也一致,所以是哪一块出问题了呢?
既然报错提到了对应的路径,那就去看看对应文件的内容吧。好家伙,这个项目没有package-lock文件,本地安装依赖的时候,eslint-plugin-import(2.18.2)依赖的eslint-config-airbnb-base包的版本采取的是最新的版本(14.2.1),这两者之前版本组合起来会有问题,后面通过升级eslint-plugin-import解决了这个问题。
在这个过程中主要是涉及到两个点的内容:
一、^ 和 ~ 版本号怎么理解
首先版本号的格式规则:主版本(修改了不兼容的API).次要版本(新增了向下兼容的功能).修订版本(修正了向下兼容的问题)
^ 则代表更新到当前 主版本 中最新的版本(从左边开始算起,碰到 第一个不为0的数+1,后面的版本为0)
^14.2.0 即 [14.2.0, 15.0.0)
^0.2.1 即 [0.2.1, 0.3.0)
^0.0.3 即 [0.0.3, 0.0.4)
~ 则代表更新到当前 次要版本 中最新的版本(从左边开始算起,碰到 第二个不为0的数+1,后面的版本为0)
~14.2.0 即 [14.2.0, 14.3.0)
~0.2.1 即 [0.2.1, 0.2.2)
二、package.json文件字段
在看node_modules中包的package.json文件时,发现这个json文件中的字段比项目配置中用到的字段还多,比较好奇分别代表什么含义,下面以项目里安装的 eslint-config-airbnb-base的配置为例。
官方package.json介绍地址
// 带下划线的字段是npm在install的时候添加的,给npm registry用的元信息
// 该信息开发者不需要关心,所以官网也没有对这些字段进行介绍(凭个人理解加上了注释,如有错误欢迎指正)
// 其他则为项目通用配置项
{
// 安装该模块时的参数(当不同包依赖该模块的不同版本时,参数就会有多个)
"_args": [
[
// npm install 后面的参数信息
"eslint-config-airbnb-base@14.2.0",
// 项目的绝对路径地址
"/Users/hby/Desktop/test/my_test"
]
],
// 当前模块是否在本地开发时才需要
"_development": true,
// 上游package.json中所写的该模块的版本
"_from": "eslint-config-airbnb-base@14.2.0",
// 该模块实际安装的版本
"_id": "eslint-config-airbnb-base@14.2.0",
// 是否在打包之后的文件里面
"_inBundle": false,
// 该模块完整性的哈希
"_integrity": "sha1-/onCSz+dyACMnA0NiMKPle1l6cQ=",
// 下载后需要安装到哪些(相对于node_modules)
"_location": "/eslint-config-airbnb-base",
// 该模块的底层包要求
"_phantomChildren": {},
// 该模块安装时的限制信息
"_requested": {
"type": "version",
"registry": true,
// 元素信息
"raw": "eslint-config-airbnb-base@14.2.0",
// 模块名
"name": "eslint-config-airbnb-base",
// 模块名编码后的内容
"escapedName": "eslint-config-airbnb-base",
// 原始版本要求
"rawSpec": "14.2.0",
"saveSpec": null,
// 最终获取的版本情况
"fetchSpec": "14.2.0"
},
// 当前模块的上游有哪些
"_requiredBy": [
"/eslint-config-airbnb"
],
// 该模块的位置
"_resolved": "http://registry.npm.taobao.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz",
// 版本要求
"_spec": "14.2.0",
// 该包需要安装到哪里(到项目级别的绝对路径)
"_where": "/Users/hby/Desktop/test/my_test",
// 作者信息,只能有一个,可以配置姓名,邮箱以及地址
"author": {
"name": "Jake Teton-Landis",
"url": "https://twitter.com/@jitl"
},
// 接收问题反馈的url地址,支持email地址,一般是GitHub项目下的issue
"bugs": {
"url": "https://github.com/airbnb/javascript/issues"
},
// 贡献值信息,支持多个,支持配置的字段和author相同
"contributors": [
{
"name": "Jake Teton-Landis",
"url": "https://twitter.com/jitl"
},
{
"name": "Jordan Harband",
"email": "ljharb@gmail.com",
"url": "http://ljharb.codes"
},
{
"name": "Harrison Shoff",
"url": "https://twitter.com/hshoff"
}
],
// 当前包所依赖的包名及对应的版本
"dependencies": {
"confusing-browser-globals": "^1.0.9",
"object.assign": "^4.1.0",
"object.entries": "^1.1.2"
},
// 包描述,有利于npm search的时候搜索到这个包
"description": "Airbnb's base JS ESLint config, following our styleguide",
// bundledDependencies: Array<string> 发布包时需要打包的依赖
// 开发时所依赖的包,即别人用这边包时,不需要安装下面的这些包
"devDependencies": {
"@babel/runtime": "^7.8.7",
"babel-preset-airbnb": "^4.5.0",
"babel-tape-runner": "^3.0.0",
"eclint": "^2.8.1",
"eslint": "^5.16.0 || ^6.8.0 || ^7.2.0",
"eslint-find-rules": "^3.5.0",
"eslint-plugin-import": "^2.21.2",
"in-publish": "^2.0.1",
"safe-publish-latest": "^1.1.4",
"tape": "^5.0.1"
},
// 项目运行的node版本要求
"engines": {
"node": ">= 6"
},
// files: Array<string> 代表 npm publish后推送到npm服务器的文件列表
// 首页地址,一般是GitHub项目地址下的README.md
"homepage": "https://github.com/airbnb/javascript",
// 关键词,同样有利于npm search
"keywords": [
"eslint",
"eslintconfig",
"config",
"airbnb",
"javascript",
"styleguide",
"es2015",
"es2016",
"es2017",
"es2018"
],
// 当前包所使用的许可证
"license": "MIT",
// 项目的入口文件,通常是项目的启动文件
// 别人在项目中引入包时,其实就是引入了该字段对应的文件
"main": "index.js",
// 包名,长度需<=214字符,不能以.或_开头,不能用大写字母(具有唯一性)
// 由于该字段会用作url的一部分、文件夹名称以及命令行参数,因此不能含有对url不安全的字符
"name": "eslint-config-airbnb-base",
// 指定所需要兼容的宿主包的版本
"peerDependencies": {
"eslint": "^5.16.0 || ^6.8.0 || ^7.2.0",
"eslint-plugin-import": "^2.21.2"
},
// 项目源码位置,type代表版本控制系统的类型,常用的有git和svn
"repository": {
"type": "git",
"url": "git+https://github.com/airbnb/javascript.git"
},
// 支持的脚本命令,具体可参考https://docs.npmjs.com/cli/v6/using-npm/scripts
"scripts": {
"lint": "eslint --report-unused-disable-directives .",
"posttravis": ":",
"prelint": "eclint check * rules/* test/*",
"prepublish": "(in-install || eslint-find-rules --unused) && (not-in-publish || npm test) && safe-publish-latest",
"pretest": "npm run --silent lint",
"pretests-only": "node ./test/requires",
"pretravis": ":",
"test": "npm run --silent tests-only",
"tests-only": "babel-tape-runner ./test/test-*.js",
"travis": "npm run --silent tests-only"
},
// 包版本
"version": "14.2.0"
}
关于package.json中模块安装元信息部分的内容,纯属个人理解,如果有小伙伴们有准确的描述,欢迎提出~~~