使用 packagejson 脚本增强“npm run dev”
从现在开始,我们要努力学习啦!今天我给大家带来《使用 packagejson 脚本增强“npm run dev”》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

npm run dev 是“本地运行我的网站”的标准,但它是如何工作的呢?我们如何扩展它的功能?在这篇文章中,我们将看看:
- 如何配置 npm run dev 的功能。
- 如何将复杂的命令分解为细粒度的单元。
- 如何并行运行多个命令。
- 如何在不失去正常 ctrl-c 行为的情况下运行先决条件。
- 启动 convex 后端时如何添加种子数据(如果不存在)。
作为一个激励示例,以下是凸帮助程序示例应用程序中定义的一些脚本。我们将介绍每个部分的作用
"scripts": {
"dev": "npm-run-all --parallel dev:backend dev:frontend",
"build": "tsc && vite build",
"dev:backend": "convex dev",
"dev:frontend": "vite",
"predev": "convex dev --until-success",
"test": "vitest"
},
它们的定义方式和位置
npm run 运行项目工作区中 package.json 中定义的命令。当您从 npm create vite@latest 等命令启动存储库时,这些命令通常是预先配置的,其中的命令为:
- dev:运行开发环境。这通常包括在文件更改时自动重新加载 ui。对于 vite 来说,这是 vite,next.js 是下一个 dev。
- build:构建用于部署的网站。这通常会编译并捆绑所有 html、css 和 javascript。对于 vite,这是 vite 构建,next.js 是下一个构建。
- test:运行测试 - 如果您使用 jest,则只需“test”:“jest”或 vitest for vitest。
这是来自 next.js 的基本示例:
// in package.json
{
// ...
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
//...
在这里你可以运行 npm run dev 或 npm run lint 等
您可以在文档中了解有关 npm run 的更多信息。
为什么使用脚本?
这是一个公平的问题,为什么人们会将已经如此简单的命令放入包脚本中。为什么不直接调用 jest 或 vite 或 next build 呢?有几个很好的理由:
- 您可以保存命令的默认参数,这样您就不必记住或记录启动某项操作的“标准”方式。我们将在下面看到如何将其配置为链接命令并并行运行其他命令。
- 它允许您轻松运行由 npm 安装但无法从 shell(终端)全局访问的命令。1 当您安装 npm install -d vitest 之类的东西时,它会将 vitest 安装到 node_modules/.bin 中。2你不能直接在 shell 中运行 vitest,3 但你可以有一个像这样的配置: "scripts": { "test": "vitest" } 并且 npm run test 将运行 vitest.
- 即使您位于子目录中,它也始终以包文件夹的根目录作为“当前目录”运行。因此,您可以定义一个类似 "foo": "./myscript.sh" 的脚本,它总是会在包根目录中(与 package.json 位于同一目录中)查找 myscript.sh。注意:您可以通过 init_cwd 环境变量访问当前调用的目录。
- 当脚本从 npm run 运行时,您可以轻松引用 package.json 中的变量。例如,您可以使用 npm_package_version 环境变量访问包的“版本”,例如 js 中的 process.env.npm_package_version 或脚本中的 $npm_package_version 。
- 如果你有多个工作区(许多目录都有自己的 package.json,并通过“workspaces”配置配置到父 package.json 中),你可以使用 npm test --workspaces 或使用 npm run 在所有工作区中运行相同的命令lint --workspace 应用程序/web.
npm run dev 可以与yarn/pnpm/bun一起使用吗?
是的!即使您使用其他包管理器安装依赖项,您仍然可以使用 npm 运行包脚本。
yarn # similar to `npm install` npm run dev # still works!
您不必记住 npm run dev 映射到yarn dev(或yarn run dev)。 npx 也是如此:无论您使用什么包管理器来安装东西,npx 凸开发都可以工作。
并行运行命令
有几个包可以用来同时运行命令:4
- npm-run-all
- 同时
我们在这里只看一下 npm-run-all 。考虑我们的例子:
"scripts": {
"dev": "npm-run-all --parallel dev:backend dev:frontend",
"dev:backend": "convex dev",
"dev:frontend": "vite",
},
这定义了三个脚本。
- npm run dev:后端运行凸开发。
- npm run dev:frontend 运行 vite。
- npm run dev 通过 npm-run-all 并行运行凸开发和 vite。
两个输出都会流出,并且执行 ctrl-c 会中断两个脚本。
预开发?后期构建?
您可以通过将命令命名为 prex 或 postx 来指定在另一个命令(例如 x)之前(前)或之后(后)运行的命令。在示例中:
"scripts": {
"dev": "npm-run-all --parallel dev:backend dev:frontend",
"dev:backend": "convex dev",
"dev:frontend": "vite",
"predev": "convex dev --until-success",
},
这将在 npm-run-all --parallel dev:backend dev:frontend 的“dev”命令之前运行凸开发 --until-success。
用“&&”链接
对于习惯 shell 脚本的人来说,如果前一个命令成功,则可以按顺序运行两个命令:commanda && commandb。这适用于 windows 和 unix (mac / linux)。
但是,仅使用预先脚本有几个优点:
- 您可以使用 npm run dev --ignore-scripts 运行任一命令以不执行“predev”脚本,或者 npm run predev 显式地仅执行“predev”步骤。
- 根据我的经验,ctrl-c 的行为更容易预测。在不同的 shell 环境中,执行 ctrl-c(向当前进程发送中断信号)有时会终止第一个脚本,但仍运行第二个脚本。经过多次尝试,我们决定切换到“predev”作为模式。
首先运行交互式步骤
对于 convex,当您第一次运行 npx 凸开发(或使用上述脚本的 npm run dev)时,如果您还没有登录,它会要求您登录;如果尚未登录,它会要求您设置项目设置。这很棒,但是当多个命令同时传输输出时,更新输出文本的交互式命令不能很好地工作。这是在 npx 凸 dev 之前运行 npx 凸 dev --until-success 的动机。
- 只要函数和模式与您部署的内容不匹配,凸开发就会同步您的函数和模式,并监视文件更改。
- --until-success 标志仅同步您的函数和模式,直到成功一次,告诉您如果出现问题要修复什么,并自动重试,直到成功或您按 ctrl-c 为止。
- 通过运行 npx凸开发 --until-success,我们可以在尝试启动前端和后端之前完成登录、项目配置和初始同步。
- 如果初始同步发现了诸如缺少环境变量之类的问题(需要在应用程序运行之前进行设置),那么它会特别有用。
- 这样,在后端准备好使用其期望的函数版本处理请求之前,前端不会启动。
启动时播种数据
如果您将 convex 的“predev”命令更改为包含 --run ,它将在前端启动之前运行服务器端功能。
"scripts": {
//...
"predev": "convex dev --until-success --run init",
//...
},
--run init 命令将运行凸/init.ts 中默认导出的函数。您还可以运行 --run myfolder/mymodule:myfunction。请参阅此处有关命名的文档。请参阅这篇关于播种数据的文章,但要点是您可以定义一个内部突变来检查数据库是否为空,如果是,则插入一组记录以用于测试/设置目的。
tsc?
如果您使用 typescript,您可以使用裸 tsc 运行类型检查/编译您的 typescript 文件。如果您的 tsconfig.json 配置为发出类型,它将写出类型。如果没有,它只会验证类型。作为构建的一部分,这非常好,因此您不会构建任何有类型错误的东西。这就是上面例子的原因:
"build": "tsc && vite build",
如何传递参数?
如果您想将参数传递给命令,例如将参数传递给测试命令以指定要运行的测试,您可以在after之后传递它们 - 以将命令与参数分开。从技术上讲,你不需要 -- 如果你的参数是位置参数而不是 -- 前缀,但总是这样做也没什么坏处,以防你忘记为哪个而做。
npm run test -- --grep="pattern"
概括
我们研究了一些使用 package.json 脚本来简化工作流程的方法。谁知道一个简单的 npm run dev 背后可以蕴含多少力量?看看我们原来的例子:
"scripts": {
"dev": "npm-run-all --parallel dev:backend dev:frontend",
"build": "tsc && vite build",
"dev:backend": "convex dev",
"dev:frontend": "vite",
"predev": "convex dev --until-success",
"test": "vitest"
},
- dev 在 predev 之后并行运行前端和后端。
- build 在构建静态站点之前通过 tsc 进行类型检查。
- dev:backend 在您编辑文件时不断将后端功能部署到您的开发环境。
- dev:frontend 运行一个本地前端服务器,它会在您编辑文件时自动重新加载。
- predev 在 dev 之前运行,并根据需要进行初始部署、处理登录、配置和初始同步。
- test 使用 vitest 来运行测试。注意:npm test 是 npm run test 以及其他命令的简写,但它们是特殊情况。 npm run test 是我建议的习惯。
-
输入 npm 时 shell 查找要运行的命令的方法是检查 shell 的 path 环境变量(无论如何在 unix 机器上)。您可以使用 echo "$path" 看到您自己的。它检查 $path 中指定的所有位置并使用第一个位置。 ↩
-
从技术上讲,您可以覆盖并指定 npm 安装二进制文件的位置。 ↩
-
如果你真的想,你可以直接运行 npm exec vitest,简称 npx vitest,./npm_modules/.bin/vitest,或者将 .npm_modules/.bin 添加到你的 path 中。 ↩
-
有些人使用裸 & 在后台运行一项任务,但这在 windows 上不受支持,并且中断一个命令不一定会杀死另一个命令。 ↩
今天关于《使用 packagejson 脚本增强“npm run dev”》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
每个开发人员都应该知道的顶级 Python 库
- 上一篇
- 每个开发人员都应该知道的顶级 Python 库
- 下一篇
- 持久且不可变的 Java LinkedList
-
- 文章 · 前端 | 6分钟前 |
- Chosen.js实现3字符触发下拉搜索
- 361浏览 收藏
-
- 文章 · 前端 | 21分钟前 | animation Transition @keyframes 组合使用 CSS动效
- CSS动画与过渡怎么配合用
- 207浏览 收藏
-
- 文章 · 前端 | 33分钟前 |
- CSS透明度技巧:opacity与rgba使用指南
- 353浏览 收藏
-
- 文章 · 前端 | 39分钟前 |
- href与src区别详解:3大核心差异解析
- 441浏览 收藏
-
- 文章 · 前端 | 42分钟前 |
- 网页上传实现图片替换与更新技巧
- 418浏览 收藏
-
- 文章 · 前端 | 44分钟前 |
- Normalize.css和Reset.css区别解析
- 128浏览 收藏
-
- 文章 · 前端 | 45分钟前 |
- 尾调用优化与递归优化技巧
- 233浏览 收藏
-
- 文章 · 前端 | 48分钟前 |
- CSS过渡效果详解教程
- 264浏览 收藏
-
- 文章 · 前端 | 49分钟前 |
- WebGL3D渲染入门指南详解
- 480浏览 收藏
-
- 文章 · 前端 | 57分钟前 |
- HTML表格压缩传输方法有哪些
- 306浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- CSSsticky定位的实用场景解析
- 178浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3210次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3424次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3453次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4561次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3831次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览

