npx使用总结---cb.apply is not a function问题解决办法

743 阅读5分钟

听说npx很好用就来试试:

npx是什么?

npx是npm5.2之后发布的一个命令。官网说它是“execute npm package binaries”,就是执行npm依赖包的二进制文件,简而言之,就是我们可以使用npx来执行各种命令。

npx官网:www.npmjs.com/package/npx

为什么要使用npx?

解决的问题

在命令行执行本地已安装的依赖包命令

使用npx可以在命令行直接执行本地已安装的依赖包命令,不用在scripts脚本写入命令,也不用麻烦的去找本地脚本。

首先来看这个场景:

我们本地安装了一个依赖包:

npm i -D mocha

想要在本地(当前目录)执行它时,什么都不做时是不能运行这个命令的:

我们一般会使用几种方式来运行我们想要运行的命令:

  1. 使用package.json的scripts脚本

//package.json

"scripts": {

  "findmocha": "mocha --version",

}

然后在命令行运行:

npm run findmocha

  1. 在命令行中直接找到模块的二进制文件运行
  2. 全局安装模块

而使用npx,我们可以直接在命令行执行我们要运行的命令:

npm i -D mocha

npx mocha --version

不用全局安装,直接在命令行执行一次性命令

有很多命令,我们只需要执行一次的,但是却要全局安装一次,实在不科学,使用npx,可以在不全局安装依赖包的情况下,运行命令,而且运行后不会污染全局环境

比如

npx create-react-app my-react-app

npx 将create-react-app下载到一个临时目录,使用以后再删除。

每次运行这个命令,都会重新下载依赖包,运行后删除。

切换node版本来运行命令

当你想要运行的命令不兼容当前的nodejs版本,可以通过npx来切换版本,指定某个版本的 Node 来运行命令。

npx的-p选项指定要安装的包,并将其添加到正在运行的$PATH中

如:

npx node@6 -v

npx node@7 -v

npx node@8 -v

以上的命令,会自动下载需要的node,执行完命令后删除。

npx的原理

npx的原理,就是在运行它时,执行下列流程:

  1. 去node_modules/.bin路径检查npx后的命令是否存在,找到之后执行;
  2. 找不到,就去环境变量$PATH里面,检查npx后的命令是否存在,找到之后执行;
  3. 还是找不到,自动下载一个临时的依赖包最新版本在一个临时目录,然后再运行命令,运行完之后删除,不污染全局环境。

安装和参数说明

安装

npm install -g npx

常用参数

-p 参数

-p参数用于指定 npx 所要安装的模块

npx -p node@6 node -v

--no-install 参数

强制使用本地模块,不下载远程模块,如果本地不存在该模块,就会报错。

--ignore-existing 参数

忽略本地的同名模块,强制安装使用远程模块

使用场景总结

使用npx执行 本地命令

npm i -D mocha

npx mocha --version

使用npx一次性执行命令

npx create-react-app my-react-app

使用npx切换node版本

npx node@6 -v

使用npx执行 GitHub 源码

npx github:piuccio/cowsay

远程代码必须是一个模块,即必须包含package.json和入口脚本

使用npx开启一个静态服务器

npx http-server    #默认返回根目录下index.html

npx http-server -p 3000  #指定端口

实际应用以及遇到的问题

然后我就有了这个想法:npx create-react-app jira1 --template typescript

然后我在控制台操作完就是出现了下面的问题

使用create-react-app创建的react项目目录不完整

问题描述

使用create-react-app创建的react项目时出现目录不完整,不完整的目录结构如下:

image.png

第一反应这是啥,我的src呢

创建方式如下:

npx create-react-app jira1 --template typescript

创建完成后控制台的展示结果如下

image.png

A template was not provided. This is likely because you're using an outdated version of create-react-app.

Please note that global installs of create-react-app are no longer supported.

翻译:未提供模板。这可能是因为您正在使用过时的create react app版本。请注意,不再支持create react app的全局安装。

查了出现原因:

create react app版本太低(2.1.5),当前最新3.4.0,如果以前将create-react-app 安装在本地,即执行了 npm install -g create-react-app就会报此错误。并且因为官方已经弃用了独立安装包 create-react-app 这个 cli 脚手架,如果没有及时卸载 就会出现这个问题。

解决方法

第一步:卸载 create-react-app

npm uninstall -g create-react-app

第二步:验证 create-react-app是否成功卸载,以确保 npx 使用最新版本创建项目。(使用create-react-app创建项目,如果执行则未成功,如果返回如下图所示则卸载成功)

image.png

第三步:create-react-app创建应用方法(本地开发环境需要保证NodeJS的版本>=8.10)

1.通过 npx 创建:

npx create-react-app my-app

2.通过 npm 创建:

npm init react-app my-app

3.通过 yarn(0.25+) 创建:

yarn create react-app my-app

选择模板

通过在命令后添加 --template [template-name] 来选择模板。

模板名的格式为 cra-template-template-name ,模板可在 npm 社区中找到很多有用的模板。(选择安装时可省略前缀 cra-template-)

ps

在未卸载create-react-app时可使用如下命令进行创建react项目(即忽略本地的cli)

npx --ignore-existing create-react-app my-app

注意点,我在使用npx的方式安装的时候遇到问题:

image.png

其实我查了很多资料

github.com/npm/npx/iss…

网上有很多关于清缓存,重装node等方案,我也有一顿尝试,可是我的问题依然有

但是中心都是围绕删除npm ,清除npm缓存,列举两个网上给的解决办法,可参考,但是解决不了我的问题

image.png

image.png

然后我就想着清除npm 找到对应的路径

image.png

找到删除,用n重新切了一下node本以为可以,但是还是不行,其实这时我也不知道为啥,但是还是要继续啊,后面我尝试用which npx的时候发现了问题

image.png

详细展示:

image.png

然后我就删除跟目录下的npx,这个应该是由于我在用n管理node版本之前,安装过node导致的

image.png

然后就可以执行了

image.png

总结这个npx确实好用,可以不用全局安装指定依赖包,并且可以用来作为node版本切换的工具,也可以用来直接跑项目。 跑项目: // 安装10.16.0版本node,并运行项目

npx -p node@10.16.0 npm run dev