package.json配置解读之入门

news2024/11/27 23:47:50

文章目录

  • 前言
  • 一、描述配置
    • name
    • version
    • repository
    • description
    • keywords
    • license
    • author
  • 二、文件配置
    • files
    • type
    • main
    • browser
    • module
    • exports
    • workspaces
  • 三、脚本配置
    • scripts
    • config
  • 四、结语

前言

package.json是每个前端项目都会有的json文件,位于项目的根目录中。很多脚手架在创建项目的时候会帮我们自动初始化好 package.json。package.json有许多配置与项目息息相关,了解他们有助于对项目的开发,接下来让我们开始了解package.json的配置。

今天主要介绍一些常用的配置,分为了七大类,分别是:

  • 描述配置
  • 脚本配置
  • 文件配置
  • 依赖配置
  • 发布配置
  • 系统配置
  • 第三方配置

一、描述配置

主要是项目的基本信息,包括名称、版本、描述、仓库、作者等。

name

项目的名称,如果是第三方包的话,可以通过该名称通过 npm install 安装。

npm install name

version

项目的版本号,开源项目的版本号遵循 semver 语义化规范,具体如下所示:
在这里插入图片描述

简单介绍一下这个数组代表什么意思:

  • 1 代表主版本号 Major,通常涉及重大功能更新时更新此版本号;
  • 2 代表次版本号 Minor,在引入了新功能,但未产生破坏性变更,依然向下兼容时会更新此版本号;
  • 3 代表修订号 Patch,在修复了一些问题,也未产生破坏性变更时会更新此版本号;

回到 package.json 的 version 字段,name + version 能共同构成一个完全唯一的项目标识符,所以它两是最重要的两个字段。

repository

项目的仓库地址以及版本控制信息。

"repository": {
  "type": "git",
  "url": "https://github.com/facebook/react.git",
  "directory": "packages/react"
}

description

关于项目的描述,会在 npm 官网展示,让其他人更快了解该项目。

"description": "package.json配置解读"

keywords

项目的技术关键词,合适的关键词可以在 npm 官网更好的检索到该项目。

"keywords": [
  "component",
  "components",
  "design",
  "framework",
  "frontend",
  "ui",
  "axios"
 ],

license

项目的开源许可证。项目的版权拥有人可以使用开源许可证来限制源码的使用、复制、修改和再发布等行为。常见的开源许可证有 BSD、MIT、Apache 等。具体可以参考阮一峰老师的这篇文章 如何选择开源许可证。

"license": "BSD"

author

这个字段不用多说,指的是该项目的作者。

"author": "May",

二、文件配置

包括项目所包含的文件以及入口等信息。

files

项目在进行发布时,可以通过 files 指定需要跟随一起发布的内容来控制 npm 包的大小,避免安装时间太长。发布时默认会包括 package.json,license,README 和main 字段里指定的文件。忽略 node_modules,lockfile 等文件。
在此基础上我们可以指定其他可以发布的内容,可以是单独的文件,文件件以及通配符匹配到的文件。一般情况下,files 里会指定构建出来的产物以及类型文件,而 src 目录下的文件不需要跟随发布。

"files": [
  "file.js",
  "may/",
  "global/*.{js,json}"
 ]

type

在node支持ES模块后,要求ES模块采用 .mjs 后缀文件名,只要遇到 .mjs 结尾的文件,就认为它是ES模块。如果不想修改文件后缀名,可以在 package.json 中修改 type 值为 module。

"type": "module"

如果还要使用 CommonJs 模块规范,那么需要将 CommonJS 模块的文件以 .cjs 结尾,不过建议这两种模块不要混合使用,会有异常报错。

main

项目发布时,默认会包括 package.json,license,README 和 main 字段里指定的文件,因为 main 字段里指定的是项目的入口文件,在 browser 和 Node 环境中都可以使用。
如果不设置 main 字段,那么入口文件就是根目录下的 index.js。

browser

main 字段里指定的入口文件在 browser 和 Node 环境中都可以使用。如果只想在 web 端使用,不允许在 server 端使用,可以通过 browser 字段指定入口。

"browser": "./browser/index.js"

module

module 字段可以用来指定 ES 模块的入口文件。

"module": "./index.mjs"

当一个项目同时定义了 main,browser 和 module,webpack,rollup 等构建工具会感知这些字段,并会根据环境以及不同的模块规范来进行不同的入口文件查找。
比如 webpack 构建项目时默认的 target 为 ‘web’,也就是 Web 构建。它的 resolve.mainFeilds 字段默认为 [‘browser’, ‘module’, ‘main’]。

module.exports = {
  //...
  resolve: {
    mainFields: ['browser', 'module', 'main'],
  },
};

此时会按照 browser -> module -> main 的顺序来查找入口文件。

exports

node 在 14.13 支持在 package.json 里定义 exports 字段,拥有了条件导出的功能。exports 字段可以配置不同环境对应的模块入口文件,并且当它存在时,它的优先级最高。比如使用 require 和 import 字段根据模块规范分别定义入口:

"exports": {
  "require": "./index.js",
  "import": "./index.mjs"
 }
}

这样的配置在使用 import ‘xxx’ 和 require(‘xxx’) 时会从不同的入口引入文件,exports 也支持使用 browser 和 node 字段定义 browser 和 Node 环境中的入口。上方的写法其实等同于:

"exports": {
  ".": {
    "require": "./index.js",
    "import": "./index.mjs"
  }
 }
}

为什么要加一个层级,把 require 和 import 放在 “.” 下面呢?
因为 exports 除了支持配置包的默认导出,还支持配置包的子路径。

workspaces

项目的工作区配置,用于在本地的根目录下管理多个子项目。可以自动地在 npm install 时将 workspaces 下面的包,软链到根目录的 node_modules 中,不用手动执行 npm link 操作。
workspaces 字段接收一个数组,数组里可以是文件夹名称或者通配符。比如:

"workspaces": [
  "workspace-s"
]

表示在 workspace-s 目录下还有一个项目,它也有自己的 package.json。

package.json
workspace-a
  └── package.json

通常子项目都会平铺管理在 packages 目录下,所以根目录下 workspaces 通常配置为:

"workspaces": [
  "packages/*"
]

三、脚本配置

scripts

指定项目的一些内置脚本命令,这些命令可以通过 npm run 来执行。通常包含项目开发,构建 等 CI 命令,比如:

"scripts": {
  "build": "webpack"
}

我们可以使用命令 npm run build 来执行项目构建。
除了指定基础命令,还可以配合 pre 和 post 完成命令的前置和后续操作,比如:

"scripts": {
  "build": "webpack",
  "prebuild": "xxx", // build 执行之前的钩子
  "postbuild": "xxx" // build 执行之后的钩子
}

当执行 npm run build 命令时,会按照 prebuild -> build -> postbuild 的顺序依次执行上方的命令。
但是这样的隐式逻辑很可能会造成执行工作流的混乱,所以 pnpm 和 yarn2 都已经废弃掉了这种 pre/post 自动执行的逻辑。
如果需要手动开启,pnpm 项目可以设置

enable-pre-post-scripts=true

config

config 用于设置 scripts 里的脚本在运行时的参数。比如设置 port 为 3001:

"config": {
  "port": "8080"
}

在执行脚本时,我们可以通过 npm_package_config_port 这个变量访问到 3001。

// 8080
console.log(process.env.npm_package_config_port); 

四、结语

今天我们简单了解了 package.json 的基础配置。写一篇文章将要介绍关于 package.json 其他配置,有了这些知识,我们可以更好的了解项目。但 package.json 里的内容远不止如此,需要我们进一步学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RHCE(chrony服务器)

chrony服务器 chrony服务器是一个开源自由的网络时间协议NTP的客户端和服务器的软件,他能让计算机保持系统时钟和时钟服务器保持同步,让计算机保持精确的时间,chrony也可以作为服务端软件为其他计算机提供时间同步服务 chrony由两部分组成&…

openAI--十拳剑助你做AI时代的弄潮儿

AI它厉害(diao)吗? 最近大家玩chatgpt还好吗? 有被它的恋爱情商暴击到吗? 有没有觉得那在leetcode上所向无敌的技巧都是浮云吗? 今天,我为大家带来十个很好的AI平台。这一篇先介绍一下&…

【远程桌面】nomachine下载安装使用教程、zerotier下载安装使用教程超详细

文章目录一、软件介绍二、NoMachine远程桌面1.Windows下载安装使用2.Linux下载安装使用3.Android下载安装使用4.ARM下载安装使用(未实践)三、ZeroTier内网穿透0.官网注册账户1.Windows下载安装使用2.Linux下载安装使用3.Android下载安装使用4.ARM下载安装…

Android 学习 - 不完善

SharedPreference 共享参数用法 SharedPreference 是 Android 的一个轻量级存储工具, 采用的存储结构是Key-Value的键值对方式. 共享参数的存储介质是符合XML规范的配置文件. 保存路径是: /data/data/应用包名/shared_prefs/文件名.xml 利用元数据配置快捷菜单 (1)元数据的met…

【阶段二】Python数据分析Pandas工具使用11篇:探索性数据分析:数据的检验:卡方检验与t检验

本篇的思维导图: 探索性数据分析:数据的检验 卡方检验 在实际的学习或工作中,也会碰到关于离散型变量之间的探索性分析,如两个离散变量之间是否相互独立。对于该问题的解答,就需要运用统计学中的卡方检验了。卡方检验属于非参数的检验方法,其原假设是两个离散变…

Spring——最全Spring目录

📫作者简介:zhz小白 公众号:小白的Java进阶之路 专业技能: 1、Java基础,并精通多线程的开发,熟悉JVM原理 2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线…

2022 IoTDB Summit:IoTDB PMC侯昊男《Apache IoTDB首创时序顺乱序分离存储引擎 IoTLSM》...

12 月 3 日、4日,2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本,并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例,深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

Flutter项目中添加Webview(八)使用JavaScript渠道

借助JavascriptChannel,您的应用可以在WebView的JavaScript上下文中注册回调处理程序,可以调用这些回调处理程序将值传递回应用的Dart代码。在此步骤中,您将注册一个使用 SMLHttpRequest的结果调用SnackBar。 将WebViewStack类更新如下所示&…

Mysql的锁(自用笔记)

笔记(https://www.bilibili.com/video/BV1Kr4y1i7ru) 什么是锁? mysql中有哪几种锁 表级锁 表级锁-表锁 write lock 写锁, 加锁客户端,可以读写操作, 其他客户端不能 读,写操作 表级锁-元数据锁 一个例子,事务中,增删改查时候,会自动加入元数据锁,不允许对表结构进行修改 …

Keras model.predict输出的概率值转换为类别

问题:使用Keras做分类任务,model.predict预测得到的值为每个类别的概率值,而不是类别。 源码: y_test_pred model.predict(x_test, batch_size256, verbose1)解决: import numpy as np y_test_pred model.predict(…

[ctf.show pwn] 新手杯,七夕杯

闲来无事作练习新手杯pwn1好长的代码,看了十几分钟,发现最后一个函数是后门,而且是不用敲的那种。void __noreturn door() {char s[32]; // [rsp0h] [rbp-50h] BYREFchar command[40]; // [rsp20h] [rbp-30h] BYREFunsigned __int64 v2; // […

【新年心安】新冠感染“阳康”套餐,“阳康”后的你,很有必要

你有没有 在阳康后还伴随 呼吸急促(气短)、全身乏力、咳嗽、出冷汗等 健康问题阳康健康检查套餐 潍坊正大光明老年病医院为更好的服务患者现推出阳康健康检查套餐,“阳康”后的你,体检先行很有必要!详情如下&#xff1…

【LeetCode面试TOP100】力扣打卡第一天!

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【LeetCode面试TOP100】 ✈️✈️本篇内容:力扣Top100——第1,2题! 🚀🚀代码存放仓库gitee:力扣面试Top100题&…

JavaScript刷LeetCode拿offer-js版字典

1. 字典简介 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。 使用 ES6 Map 1.1 字典的常用操作 const m new Map();// 增 m.set(a, aa); m.set(b, bb);// 删 m.delete(b); m.clear();// 改 m.set(a, aaa)// 查 m.get(a…

【JavaScript 逆向】极验三代无感验证码逆向分析

相关文章 【JavaScript 逆向】极验三代滑块验证码逆向分析 【JavaScript 逆向】极验四代无感验证码逆向分析 【JavaScript 逆向】极验四代滑块验证码逆向分析 声明 本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我…

ESP32设备驱动-HDC1008温度传感器驱动

HDC1008温度传感器驱动 1、HDC1008介绍 Texas Instruments 的 HDC1008 是一款带有集成温度传感器的数字湿度传感器,能够以极低的功耗提供出色的测量精度。 该设备基于新型电容传感器测量湿度。 湿度和温度传感器在出厂时已校准。 创新的 WLCSP(晶圆级芯片规模封装)使用超紧…

dubbo源码实践-Exchange 信息交换层例子

1 Exchange 层概述官方定义:exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer。其中Exchanger是SPI扩展点&…

虹科分享 | 网络流量监控 | 构建大型捕获文件(Ⅰ)——Wireshark过滤器和其他Allegro网络万用表工具

数据包分析是一个复杂的话题。如果在没有设置参数的情况下启动Wireshark,就会开始实时捕获或打开一个预先录制的pcap文件。在很短的时间内,可能有成千上万的数据包等待分析。有一种危险,就是被大量的数据困住了。 然而,如果用户想…

BPF学习笔记(八)--Linux tracing system对比分析

Linux trace技术发展已久,经常看到很多的专业术语,从perf LTTng systemtap bpftrace tracepoint trace BCC bpf ebpf等词汇,这些关键的词汇有着怎样的联系和关联,通过下面的这个图可以直观的认识到这几种关键技术的内在联系。 整…

Java认识多线程与Thread类的使用

目录 认识线程(Thread) 概念 为什么会有线程的出现? 刨根问底。为什么进程的创建与销毁效率很低呢? 多线程的轻量体现: 进程与线程的区别 第一个多线程程序 抢占式执行是啥 JDK中jconsole工具的使用 创建线程…