共计 字 • 阅读约 min

前言

如今,前端项目越来越负责,依赖越来越多,小伙伴一起合作才能完成项目的开发任务。node 版本过高、过低或者包管理器不一致,项目中好几个 .lock 文件,你有没有遇到过?这些问题可能最终会导致项目无法运行或者无法打包,通常遇到这一类问题,没有足够的经验,是很难发现问题的。所以在项目中限制安全运行环境版本,是一个很好的规避方式。本文以 pnpm 为例,讲述如何限制项目环境版本

配置 engines

根据 npm-package 文档的描述,可以在 package.json 中通过 engines 属性指定 Node.js 的版本。更多的版本配置规则,请参考 semver

{
  "engines": { 
    "node": ">=14.0.0",
    "pnpm": ">=7.0.0"
   }
}

在项目根目录新建 .npmrc 文件,添加以下内容,启用严格模式。这样在版本不符合规定时,就会报错,而不是警告

engine-strict = true

这样,在执行 <npm | yarn | pnpm> install 安装项目依赖时,node 必须大于等于 14.0.0 并且 pnpm 大于等于 7.0.0 版本才可以正确的安装。

如何主动检查环境

pnpm yarn

pnpmyarn 运行脚本,会自动 校验本机环境是否符合 engines 中配置的版本,npm 则不会 。

{
  "script": { 
    "check-env": "echo check environment successfully"
   }
}

image1654584009121.png

npm

推荐使用 pnpm 或者 yarn 来安装依赖,如果必须使用 npm。我们还可以使用 npm hooks 来自己实现版本的校验

npm i semver

semver 是一个语义版本检查器

const semver = require('semver')
const { engines } = require('./package')
const version = engines.node

if (!semver.satisfies(process.version, version)) {
  console.log(
    [
      '\033[41;30m UNEXPECTED node version \033[41;32m\033[0m',
      'Your Node version is incompatible with ' + process.mainModule.path + '.',
      'Expected version: ' + version,
      'Got: ' + process.version
    ].join('\n')
  )
  process.exit(1)
}else{
  console.log(`echo check environment successfully`)
}

{
  "scripts": {
    "check-env": "node ./checkver.js"
  }
}

再次执行 npm run check-env 就会看到提示

补充:限定包管理器

{
  "srcipt":{
    "preinstall":"npx only-allow pnpm"
  }
}

此时,只能使用 pnpm install 安装依赖,非 pnpm 在运行 install 命令时则会出现以下报错

image1654583985374.png

完结!!🎉 希望可以帮助到有需要的小伙伴



文章更新于: 2022-6-7 14:59:40