浅析 package.json

龄官
• 阅读 3676

每个前端项目中都有一个 package.json 文件,你了解它吗?花几分钟再重新审视一下这个熟悉的陌生人。

如何生成 package.json

在项目文件夹下执行npm init -y快速生成。 -y代表一路 yes。打开文件我们看到以下信息。

{
  "name": "package-json",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

逐个介绍下上述字段:

  • name包名称,必填项
  • version包版本,必填项
  • description包描述信息,一句话介绍这个包的用途
  • main包入口文件。
    require('package-json'),相当于使用了包的index.js。 该字段在开发 npm 包时较为常见,身为切图仔的我们接触的不多。
  • scripts包执行脚本,常用的npm startnpm run devnpm run build都是注册在这里的。
  • keywords关键词与 description 类似,用于介绍包的用途
  • author 包创建者
  • license 包协议,用于规定是否开源、是否付费

web 项目的 package.json

大部分开发者是围绕 web 开发进行工作的。我们来看看 web 项目的 package.json 常见配置字段 dependenciesdevDependenciesprivatescripts...

dependencies & devDependencies

面试官:请讲讲 dependenciesdevDependencies的区别?

简单,dependencies是生产环境的依赖,安装包时执行npm install -S xxx;devDependencies 是开发环境的依赖, 安装包需要执行 npm install -D xxx

生产环境和开发环境指什么?如果不小心将 react 或 vue 这种依赖安装到 devDependencies列表中项目还能运行吗?

浅析 package.json

就 web 项目而言,笔者认为dependenciesdevDependencies的本质差异并不大。包安装在哪,项目都能正常的构建、运行。差异主要在于语义表达。

dependencies往往是指打包构建后依赖包的代码会被打进产物中,在生产环境运行中是不可缺少的。

devDependencies是指那些开发、构建过程中那些工具,如构建使用的webpack、代码检查的 eslint、代码转义的 babel 等都属于开发环境依赖。他们存在的目的是:帮助我们将开发的代码安全、便捷的转换成用户浏览器可执行的代码。

还有一点差异, npm install --production=true 不会安装 devDependencies下的依赖的,只会安装dependencies的依赖。一般没人会控制这个变量。

private

若package.json中设置了 "private": true,npm 将拒绝发布它。
web 项目大多不需要提交到 npm 仓库,建议将 private 设为 true。

顺便一提 monorepo 热潮下,大家会将 monorepo 项目根目录的 private 设为 true,来避免哪个小伙伴误将整个目录发包

scripts

scripts控制项目生命周期的脚本。想一下天天用的 npm run dev、npm run build、npm run lint都做了哪些事情。看看scripts配置便知。

如果想了解团队项目工程化实现,那么也建议从 scripts 配置入手,一点点读懂命令对应的脚本文件,你就是工程大佬了。

scripts需要着重介绍的一点是命令钩子prepost。钩子可以注册某命令的前置命令和后置命令。
写个例子吧:

{
  "scripts": {
    "prexxx": "echo 'start~'",
    "xxx": "echo 'xxx running'",
    "postxxx": "echo 'end!'"
  }
}

当我们执行 npm run xxx时会看到下面结果。prexxxpostxxx被自动执行。

浅析 package.json

用途:在commit之前执行 lint ,npm run dev之前自动为用户安装包等等~

想想还可以做哪些事情,欢迎讨论。

engines

我们很难保证同事间的开发环境统一,例如不同开发者的 node 版本是不一致的,有人是8.x, 有人是10.x 有人是14.x。来个新人问一下你们 node 用什么版本,累不累。配置下 engines

"engines": {
  "node": ">=12.10.0 <15"
}

上述版本是我乱写,如果开发者的版本不符合要求控制台会报错引导用户去改正,避免了口口相传

非 web 项目的 package.json

之前介绍的字段,同样适用。有几个属性是包项目常用且有用的。
mainfilesbin

main

前文已经介绍过, 包的入口文件。默认是项目根目录下的index.js。

"main":"./lib/index.js",

如果你的包名是package-json, 当用户代码require('package-json')时,相当于require了你包目录下的 ./lib/index.js文件。

files

files用于决定哪些文件被发布到 npm 仓库去。不在files中的文件,包的使用者是无法访问的,main指向的文件也必须存在于这个列表范围内。

"files": [
    "src",
    "dist/*.js",
    "types/*.d.ts"
  ],

bin

命令行工具入口。当你的包提供了一个命令行工具时,你需要为命令行工具指定一个入口。命令名称和本地可指定文件的对应关系。可以参考看看vue-cli-service的源码

"bin": {
    "vue-cli-service": "bin/vue-cli-service.js"
  }

如果你细心的话会发现咱们项目下的node_modules/bin文件夹里有好多可执行文件。

浅析 package.json

对使用者来说:本地安装包的bin下的可执行文件会被链接到 ./node_modules/.bin/;全局安装包的bin将会被软链到 /usr/local/bin下。

dependencies & devDependencies

当我们的项目作为一个包提供给别人使用时,开发者执行npm install我们需要注意只有dependencies会作为包的依赖安装,devDependencies则会被忽略掉,讲到这里相信大家终于能理解什么是开发环境、什么是生产环境了。

开发包是需要注意不要误将生产依赖安装到devDependencies中去,会导致你的用户跑不起来。

其他

建议:有什么工程上的疑问,自己先看项目配置文件,还不懂再咨询同事。不然可能会被喷~

关注我,不迷路

浅析 package.json

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
龄官
龄官
Lv1
角声吹彻小梅花。夜长人忆家。
文章
4
粉丝
0
获赞
0