你真的懂package.json吗

package.json中的版本和package-lock.json的作用 引言 我们在搭建项目的时候,通过 npm 安装的依赖模块时,package.json文件中依赖的版本号前面会带符号 ^,有时候我们看别人的项目时也可能会看版本前带符号 ~ ,或者什么也不带,其中会有什么区别呢?而且当你的 npm 版本升级到 5.X.X 版本以上的时候,对应目录下还是自动生成一个 package-lock.json 文件,这个文件的作用又是什么呢。博主根据网上资料简单说明一下。 ... 阅读详情

在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json。
我之前看别人项目中package.json文件的scripts这样写:
“dev”: “rimraf “config/.conf.json” && rimraf “src/next.config.js” && cpx “.conf.json” “config/” && nodemon server/index.ts”,
“clean”: “rimraf ./dist && mkdir dist”,
“prebuild”: “npm run clean”,
“build”: “cross-env NODE_ENV=production webpack”
复制代码当时看的有点懵, 于是又补了下相关知识, 发现原来package.json有很多地方被我们忽略了呀, 如果有道友和我一样有点懵的话, 本文不容错过。
bin
它是一个命令名和本地文件名的映射。在安装时,如果是全局安装,npm将会使用符号链接把这些文件链接到prefix/bin,如果是本地安装,会链接到./node_modules/.bin/。
通俗点理解就是我们全局安装, 我们就可以在命令行中执行这个文件, 本地安装我们可以在当前工程目录的命令行中执行该文件。
“bin”: {
“gynpm”: “./bin/index.js”
}
复制代码要注意: 这个index.js文件的头部必须有这个#!/usr/bin/env node节点, 否则脚本将在没有节点可执行文件的情况下启动。
小实验
通过npm init -y创建一个package.json文件。
{
“name”: “cc”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“bin”: {
“mason”: “./index.js”
},
“scripts”: {},
“keywords”: [],
“author”: “”,
“license”: “ISC”,
“dependencies”: {}
}
复制代码在package.json的同级目录新建index.js文件
#!/usr/bin/env node

console.log(‘cool’)
复制代码然后在项目目录下执行: mac下: sudo npm i -g, window下: npm i -g
接下来你在任意目录新开一个命令行, 输入mason, 你讲看到
cool字段。
不知道通过这个小实验能不能帮助大家更好的理解这个bin的作用。像我们常用的vue-cli, create-react-app等都是通过bin属性将命令映射到了全局上。
main
main很重要, 它是我们项目的主要入口。
“main”: “app.js”
复制代码像这样, 我们项目就会以根目录下的app.js文件作为我们的项目入口文件了。
scripts
npm 允许在package.json文件里面,使用scripts字段定义脚本命令。
优点:
项目的相关脚本,可以集中在一个地方。
不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可。

可以利用 npm 提供的很多辅助功能。
复制代码
npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。
比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。
这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。
*通配符
*表示任意文件名,**表示任意一层子目录。

“lint”: “jshint .js"
“lint”: "jshint **/
.js”

复制代码如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义。
“test”: “tap test/*.js”
复制代码脚本传参符号: –
“server”: "webpack-dev-server --mode=development --open --iframe=true ",
复制代码脚本执行顺序
并行执行(即同时的平行执行),可以使用&符号
$ npm run script1.js & npm run script2.js
复制代码继发执行(即只有前一个任务成功,才执行下一个任务),可以使用&&符号
$ npm run script1.js && npm run script2.js
复制代码脚本钩子
npm 脚本有pre和post两个钩子, 可以在这两个钩子里面,完成一些准备工作和清理工作
eg:
“clean”: “rimraf ./dist && mkdir dist”,
“prebuild”: “npm run clean”,
“build”: “cross-env NODE_ENV=production webpack”
复制代码npm 默认提供下面这些钩子:
prepublish,postpublish
preinstall,postinstall
preuninstall,postuninstall
preversion,postversion
pretest,posttest
prestop,poststop
prestart,poststart
prerestart,postrestart
复制代码拿到package.json的变量
npm 脚本有一个非常强大的功能,就是可以使用 npm 的内部变量。
首先,通过npm_package_前缀,npm 脚本可以拿到package.json里面的字段。比如,下面是一个package.json。
// package.json
{
“name”: “foo”,
“version”: “1.2.5”,
“scripts”: {
“view”: “node view.js”
}
}

复制代码我们可以在自己的js中这样:
console.log(process.env.npm_package_name); // foo
console.log(process.env.npm_package_version); // 1.2.5
复制代码常用脚本

// 删除目录
“clean”: “rimraf dist/*”,

// 本地搭建一个 HTTP 服务
“serve”: “http-server -p 9090 dist/”,

// 打开浏览器
“open:dev”: “opener http://localhost:9090”,

// 实时刷新
“livereload”: “live-reload --port 9091 dist/”,

// 构建 HTML 文件
“build:html”: “jade index.jade > dist/index.html”,

// 只要 CSS 文件有变动,就重新执行构建
“watch:css”: “watch ‘npm run build:css’ assets/styles/”,

// 只要 HTML 文件有变动,就重新执行构建
“watch:html”: “watch ‘npm run build:html’ assets/html”,

// 部署到 Amazon S3
“deploy:prod”: “s3-cli sync ./dist/ s3://example-com/prod-site/”,

// 构建 favicon
“build:favicon”: “node scripts/favicon.js”,

复制代码介绍几个在npm脚本中好用的模块
cpx全局复制
一个很好用的模块, 可以监视全局文件变化, 并将其复制到我们想要的目录
我们使用npm安装就可以在npm的脚本中使用了:
“copy”: "cpx “.conf.json” “config/” "
复制代码这样我们运行npm run copy就可以将根目录下的.conf.json文件拷贝到config文件夹下了, 如果没有config文件夹就会新建一个。
cpx “src/**/*.{html,png,jpg}” app --watch
复制代码当src目录下的任意.html, .png, .jpg等文件发生变化就拷贝到app目录下。
cross-env能跨平台地设置及使用环境变量
大多数情况下,在windows平台下使用类似于: NODE_ENV=production的命令行指令会卡住,windows平台与POSIX在使用命令行时有许多区别(例如在POSIX,使用$ENV_VAR,在windows,使用%ENV_VAR%。。。)
cross-env让这一切变得简单,不同平台使用唯一指令,无需担心跨平台问题:
“start”: “cross-env NODE_ENV=production node server/index.js”,
复制代码dependencies和devDependencies
这两个主要就是存放我们项目依赖的库的地方了, devDependencies主要是存放用于本地开发的, dependencies会在我们开发的时候带到线上。
通过npm i xxx -S会放在dependencies, npm i xxx -D会放在devDependencies。所以我们在装包的时候一定要考虑这个包在线上是否用的到, 不要全都放到dependencies中,增加我们打包的体积和效率。
peerDependencies
我们在一些项目的package.json中看到这个属性, 它主要是考虑兼容问题,通俗点理解, 我们通过这个属性可以告诉要使用我们这个模块的人:
你要使用我, 最好把xxx1, xxx2也带上, 不然我可能会给你带来麻烦的。
“peerDependencies”: {
“xxx1”: “1.0.0”,
“xxx2”: “1.0.0”,
}
复制代码这样在装包的时候同时也会, 带上xxx1和xxx2这两个包。
个人觉得比较重要的就是这几个了。还有一些, 像: author, version, keywords, descript

作者:MasonEast
链接:https://juejin.im/post/5dea1095e51d4558083322e2
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

NAT反向代理技术的实现(外网访问内网) NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的 阅读详情

相关推荐

无线控制的隐形桥梁:深入解析NRF24L01在电机控制中的数据传输艺术

本文深入解析NRF24L01无线模块在电机控制中的数据传输技术,涵盖通信机制优化、抗干扰策略及实时性保障。通过舵机和无刷电机的实战案例,展示如何构建稳定高效的无线控制系统,为嵌入式开发提供完整解决方案。

j7k8l的博客 333

这还是我最熟悉的package.json吗?

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群原创@前端司南前言在上一篇npm init @vitejs/app的背后,仅是npm...

程序员成长指北 217

F28335 DSP ePWM模块实战:从基础配置到电机控制

本文详细解析了TI TMS320F28335 DSP的ePWM模块,从基础概念、寄存器配置到实战应用。通过代码示例,手把手教你如何配置定时中断、生成PWM波形、实现死区保护与故障联防,并最终完成一个可调速、可换向的直流电机控制项目,是掌握F28335电机控制核心技术的实战指南。

g5h6i的博客 1127

1.2 nest.js中package.json命令说明及简单调试

nest.js简单调试

LetsStudy的博客 915

统信UOS系统盘扩容保姆级教程:用GParten-分区编辑器5分钟搞定

本文提供统信UOS系统盘扩容的详细图形化教程。针对系统盘空间不足问题,重点介绍如何使用系统自带的GParten-分区编辑器,在5-10分钟内安全、直观地完成扩容操作,无需记忆复杂命令,适合所有用户快速解决存储空间告急的困扰。

e3f4g5的博客 640

F5 shape最新版逆向分析(美西南、xbk)

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,如有侵权,请联系作者立即删除。今天来简单秀下传说中的f5 shape,这是一个数一数二的盾,jsvmp+顶级风控,就算技术实力再强,也是需要花很多时间去摸索的,如果您遇到了这个盾又没有太多的时间去搞,欢迎来找我们。

mature的博客 3652

前端项目中的package.json文件常用配置项的作用

今天我们简单了解了 package.json 的常见配置。有了这些知识,我敢说绝大多数项目的 package.json 你都能毫无压力的阅读。但 package.json 里的内容远不止如此,比如 semver 规范,入口文件,项目依赖等都还有很多值得深入的内容,认识他们只是第一步。

qq_51416940的博客 3137

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4667

CVD高速节流阀国产化:真空动态控制与工艺稳定性突破

化学气相沉积(CVD)是半导体、LED及光伏制造的核心工艺,其成膜质量高度依赖下游排气系统的动态响应能力。高速节流阀作为CVD腔室压力调控的关键执行器,需在毫秒级时间尺度内实现±0.1Pa级精度的微流量调节,本质是真空流体力学、材料耐蚀性、实时控制算法与精密制造的深度耦合。传统依赖进口方案面临交期长、成本高、协议封闭等系统性风险,而国产化突破不仅在于参数对标,更在于构建可解释的阀芯流导模型、场景适配的梯度复合材料结构,以及融合前馈补偿的FPGA级实时控制。本文聚焦CVD工艺中高速节流阀的动态响应机制与国产替

weixin_33912246的博客 409

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4271

Pydoll浏览器自动化框架教程

让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 204

深入理解 package.json 文件与 package-lock.json 文件

文件一般都在每个项目的根目录下面,定义了这个项目所需要的各种模块,以及项目的配置信息,包括名称、版本、许可证、依赖模块等元数据。格式是严格的JSON格式。当你执行 npm install 的时候,node 会先从 package.json 文件中读取所有 dependencies 信息,然后根据 dependencies 中的信息与 node_modules 中的模块进行对比,没有的直接下载,已有的检查更新。

When you can't win by being better, you can win by being different. 2万+

【华为OD技术面试手撕真题】25、验证IP地址 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

验证IP地址 华为od机试真题,华为OD技术二面,华为od机考,华为od手撕真题,华为od技术二面,华为od机试,华为OD机试的高频手撕代码题,华为od八股文

KJ.JK 4043

详解package.json和package-lock.json

package.json和package-lock.json

苏纯的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

PACKAGE.JSON和PACKAGE-LOCK.JSON

是node.js的首先要明确一点,package.json不会自动生成,需要我们使用命令创建。是自动生成的,我们使用 npm install 安装包后就会自动生成使用npm init -y 或者 npm init -f就可以一键生成文件啦。和是和的简写形式)

m0_74416054的博客 1893

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

package.json 与 package-lock.json文件的区别

package.json与package-lock.json文件的区别

似水流年QC的博客 9805

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

package.json 与 package-lock.json 的区别

前言 现在前端越来越流行模块化开发,安装使用 node 和 npm 可以方便下载管理各个依赖模块。而描述模块信息的文件就是 package.json ,那么package-lock.json 又是什么,跟 package.json 有什么关系?本文将对该问题进行探索。 一、package.json { "name": "webpack-test", "version": "1....

杏子 2万+

关于package.json 和package-lock.json

每日鸡汤,每个你想要学习的念头都是未来的你向自己求救 一直在纠结,每次pull 完代码之后重新install , package-lock.json就改变了,那么我改完代码之后需要把这个package-lock.json提交么? 让我们先来来看看package.json 每个包前面的^ 代表 大版本的依赖包^1.2.3中的1 ~ 代表次要版本号 ~1.2.3中的2 如果什么符号都不加则是指定版本,这也就是说的锁定版本,好处是避免包更新带来的bug 指定安装版本npm install xx@1..

有一棵树的博客 8536

【node使用】package.json详解以及package-lock.json的作用

一、创建 package.json 输入如下命令之后,会要求填写基本的配置信息,这里,我们选择一路回车即可,待生成 package.json 文件之后,再来配置。 npm init 二、配置 package.json 当然,.json 文件是不允许写注释的,这里只是方便大家阅读而已 { // 包的名称 "name": "sg-utils", // 包的版本号 "versi...

猿始森林 5852

package.json与package-lock.json

package.json 记录当前项目所依赖模块的版本信息,更新模块时锁定模块的大版本号(版本号的第一位),不能锁定后面的小版本, package-lock.json package-lock.json 是在 `npm install`时候生成一份文件。记录了node_modules目录下所有模块(包)的名称、版本号、下载地址、及这个模块又依赖了哪些依赖。 两者区别: npm5以前 npm5以前,没有package-lock.jso...

weixin_45626517的博客 2万+

这下 package.json 里面的字段就清楚了

这下 package.json 里面的字段就清楚了

我是张跑跑 3037

package.json文件解析

package-lock.json的主要目的是确保即使是在不同环境中,使用相同的package.json文件也能获得一致的依赖树。这个文件在npm 5被引入,因此如果使用npm 5或更高版本,就会在项目中看到package-lock.json文件,除非明确地禁用了它。有了package-lock.json以后,npm会根据package-lock.json里的内容来处理和安装依赖,而不是根据package.json。yarn.lock的作用和package-lock.json类似,都是为了锁定唯一版本。

夏天又到了的专栏 1426

package.json和package-lock.json分析

在分析之前一定要 了解 node环境下npm这个包管理工具, 因为在使用npm进行本地安装就会生成 pacage.json 这个文件(内部记录了我们安装的包的版本信息)。这里又引入一个本地安装的概念,

m0_69497411的博客 2405

Vue 项目中 package.json 与 package-lock.json 的深度解析

特性主要目的定义项目配置和依赖范围锁定依赖的确切版本内容类型用户可编辑的配置文件自动生成的锁定文件版本控制使用语义化版本范围记录精确版本号依赖树只记录直接依赖记录完整的依赖树更新方式手动编辑或通过命令修改自动生成/更新Git 提交必须提交强烈建议提交文件大小较小(KB 级别)较大(MB 级别)是项目的"愿望清单" - 定义你想要什么是项目的"购物收据" - 记录你实际得到了什么最佳实践始终将两个文件都提交到版本控制使用npm ci在生产环境安装依赖定期运行npm update。

2501_91889873的博客 2218

package.json 和 package-lock.json 解析

前端每个项目的根目录上有一个 package.json 文件,定义了当前项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等)。当运行 npm install命令时,会根据文件中的配置自动下载所需的模块配置项目所需的运行和开发环境。

薛定谔的猫-前端领域 6198
上一篇: 推荐几款Linux下比Notepad++好的编辑器软件
下一篇: 目前十分流行的web框架--Flask
妄想编程
博客等级 码龄8年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值