首页 > 其他分享 >浅析npm init、create、exec,npx。

浅析npm init、create、exec,npx。

时间:2023-07-19 16:14:49浏览次数:38  
标签:npm bin exec create init 浅析 vite

npm-exec

npm exec

  • npm exec <pkg>

npm x

  • npm x <pkg>

npm官方文档中指出x,其实就是exec的别名,通俗来讲意思就是npm execnpm x,两个命令是完全等价的。

npm exec <pkg>的执行流程 - 在本地查找是否有<pkg>对应的npm包 - 若找到,则运行这个包的package.jsonbin字段对应的可执行文件 - 若未找到,在远程npm仓库查找是否有<pkg>对应的npm包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.jsonbin字段对应的可执行文件

同时,在执行bin字段有几点注意的 - 如果bin只有一个入口,那么可以执行 - 如果bin有多个入口,则寻找和包名一样的那个入口 - 如果没找到,则npm exec <pkg>报错

下面用create-vite这个npm包举个例子:

// 这是他的package.json中的字段,简单列举,省略很多
{
    "name": "create-vite"
    "bin": {
        "create-vite": "index.js",
        "cva": "index.js"
    }
    ...
}

执行npm exec crate-vite这条命令后 - 首先本地查找是否有create-vite这个npm包 - 找到,则运行create-vite这个npm包中的package.jsonbin字段对应的可执行文件,即index.js这个文件 - 若未找到,在远程npm仓库查找是否有create-vite这个包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.jsonbin字段对应的可执行文件,即index.js这个文件

看了bin字段的内容,我们不妨在执行一下npm exec cva这条命令,执行流程和上面的npm exec crate-vite也是一样的,但是执行后我们会发现,这个命令报错了,那么为什么呢?

那么我们来分析一下:执行npm exec cva这条命令后 - 首先本地查找是否有cva这个npm包 - 找到,则运行cva这个npm包中的package.jsonbin字段对应的可执行文件 - 若未找到,在远程npm仓库查找是否有cva这个包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.jsonbin字段对应的可执行文件

这样我们应该就明白了,执行npm exec cva这条命令后,我们其实是需要执行cva这个包中package.json文件中的bin字段,而不是create-vite这个包中的package.json文件中的bin字段。

说巧不巧,npm官方库中还真有cva这个包,他的package.json文件如下:

{
  "name": "cva",
  "version": "0.0.0",
  "description": "Awesome node module",
  "keywords": [
    "placeholder",
    "zce"
  ],
  "license": "MIT",
  "author": {
    "name": "zce",
    "email": "[email protected]",
    "url": "https://zce.me"
  }
}

从上面我们可以看出,cva这个包的package.json中根本就没有bin字段,所以npm exec cva显然会报错。

npx

npm文档中提到:npx的二进制文件在npm v7.0.0中被重写,而独立的npx包在当时已弃用。npx使用npm exec命令,而不是单独的参数解析器和安装过程。并提供了一些支持,以保持与它在以前版本中接受的参数的向后兼容性。

因此我们姑且理解 npx = npm execnpm x

所以上面的npm exec create-vite我们也可以使用npx create-vite去执行

npm-init

npm init

  • npm init
  • npm init <initializer>

npm create

  • npm create
  • npm create <initializer>

npm innit

  • npm innit
  • npm innit <initializer>

npm官方文档中指出createinnit其实就是init的别名,通俗来讲意思就是,其实npm initnpm createnpm innit三个命令是完全等价的。

  • npm initnpm createnpm innit

这种后面没有<initializer>是用来创建package.json文件的

  • npm init <initializer>npm create <initializer>npm innit <initializer>

这里的npm init <initializer>实际会调用npm exec create-<initializer>, 也相当于npx create-<initializer>。 我们可以把这个<initializer>理解为 有特殊格式包名的包 的简称,它真正的包名为create-<initializer>,也只有符合这种特殊格式(create-<xxxx>)的包才可以执行这样的命令。

再用create-vite这个包举例,那么此时我们也可以通过执行npm create vitenpm init vitenpm innit vite这些命令来使用这个包了。

总结

综上,对于举例的create-vite这个包我们可以有多种方法使用:

npm init vite/ npm create vite/ npm innit vite

npm exec create-vite/ npm x create-vite

npx create-vite

类似的例如create-react-app这个包我们也可以有多种方法使用:

npm init react-app/ npm create react-app/ npm innit react-app

npm exec create-react-app/ npm x create-react-app

npx create-react-app

不过react的脚手架略有不同,当我们直接使用npx create-react-app的时候它会提示我们需要指定项目目录,即npx create-react-app <project-diretory>,我们只需要在npx create-react-app后加上一个项目名就行。

相同的create-nuxt-appcreate-next-app等等也是一样的原理。

 

轉載自: https://zhuanlan.zhihu.com/p/619991024

标签:npm,bin,exec,create,init,浅析,vite
From: https://www.cnblogs.com/longxingzhe/p/17565868.html

相关文章

  • 使用mvn test -Dtest=具体方法名,结果报:No tests were executed!
    执行命令:mvnw.cmdtest-Dtest=com.cy.store.mapper.UserMapperTests#print问题描述:[ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-surefire-plugin:2.22.2:test(default-test)onprojectstore:Notestswereexecuted! (Set-DfailIfNoTests=falseto......
  • docker exec 执行sql
    实现"dockerexec执行sql"的步骤为了实现"dockerexec执行sql",我们可以按照以下步骤进行操作:步骤描述步骤1运行一个适合的数据库容器步骤2进入容器步骤3执行SQL命令现在让我们逐步解释每个步骤需要做什么,并提供相应的代码示例。步骤1:运行一......
  • (笔记)位置式PID与增量式PID区别浅析
    一、PID控制算法 什么是PID PID控制器以各种形式使用超过了1世纪,广泛应用在机械设备、气动设备和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法PID实指“比例proportional”、“积分integral”、“微分derivative”,这三项构......
  • npm安装教程 搭建vue
    一、相关概念npm:Nodejs下的包管理器。webpack:它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包。vue-cli:用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要npminstall......
  • 浅析vue3中如何使用动态组件、如何快速理解Vue3的 toRaw和markRaw、ref与shallowRef、
    一、Vue3中使用component:is加载动态组件1、不使用setup语法糖,这种方式和vue2差不多,is可以是个字符串2、使用setup语法糖,这时候的is如果使用字符串就会加载不出来,得使用组件实例<componentclass="task-box":is="componentObj[route.params.type]":info="taskInfo"></co......
  • java ExecutorService 主线程不停吗
    如何实现"JavaExecutorService主线程不停"1.简介在Java中,可以使用ExecutorService来实现多线程任务的执行和管理。主线程指的是调用ExecutorService的线程,在任务执行完成之前,主线程通常是需要等待的,但有时候我们希望主线程不停止,而是继续执行其他操作。本文将介绍如何实现这......
  • npm install xxx 后加上-s、-d、-g之间的区别?
    1、npminstallxxx-snpminstallxxx-s、npminstallxxx-S是npminstallxxx--save的简写形式局部安装,记录在package.js文件中dependencies对象中dependencies:生产环境的依赖包例如:vue、jquery、element-ui、echarts等。 2、npminstallxxx-dnpminstallxxx-d、n......
  • mysql报错:You must reset your password using ALTER USER statement before executin
    mysql报错:YoumustresetyourpasswordusingALTERUSERstatementbeforeexecutingthisstatement.新安装mysql后,登录后,执行任何命令都会报错:YoumustresetyourpasswordusingALTERUSERstatementbeforeexecutingthisstatement. 【解决办法】MySQL版本5.7.6版本......
  • 解决php中通过exec调用python脚本报ModuleNotFoundError错误
    背景出于某些原因,我们有时会在PHP中通过exec来调用Python代码,有可能是某些功能只能用Python实现(或用Python实现比较方便),有可能是出于性能考虑(Python可以执行耗时任务)。但我们有时会发现,在控制台用命令行的方式运行python脚本一切正常,在php中用exec调用就报ModuleNotFoundEr......
  • ThreadPoolTaskExecutor自定义线程池的配置和使用
    ThreadPoolTaskExecutor自定义线程池的配置和使用线程池ThreadPoolTaskExecutor和ThreadPoolExecutor的区别ThreadPoolExecutor,这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程,避免了创......