了解可执行的NPM包

NPM是Node.js的包管理工具,随着Node.js的出现,以及前端开发开始使用gulp、webpack、rollup以及其他各种优秀的编译打包工具(大多数采用Node.js来实现),大家都开始接触到一些Node.js,发现了使用NPM来管理一些第三方模块会很方便。
大家搬砖的模式也是从之前的去插件官网下载XXX.min.js改为了npm install XXX,然后在项目中require或者import。

当然,NPM上边不仅仅存在一些用来打包、引用的第三方模块,还有很多优秀的工具(包括部分打包工具),他们与上边提到的模块的区别在于,使用npm install XXX以后,是可以直接运行的。

常见的那些包

可以回想一下,webpack官网中是否有过这样的字样:

> npm install webpack -g > webpack

当然,现在是不推荐使用全局安装模式的,具体原因会在下边提到

以及非全局的安装使用步骤:

> npm install webpack

然后编辑你的package.json文件:

{ "scripts": { + "webpack": "webpack" } }

再使用npm run就可以调用了:

> npm run webpack

以上非全局的方案是比较推荐的做法

不过还可以顺带一提的是在NPM 5.x更新的一个新的工具,叫做npx,并不打算细说它,但它确实是一个很方便的小工具,在webpack官网中也提到了简单的使用方法

就像上边所提到的修改package.json,添加scripts然后再执行的方式,可以很简单的使用npx webpack来完成相同的效果,不必再去修改额外的文件。(当然,npx可以做更多的事情,在这里先认为它是./node_modules/webpack/bin/webpack.js的简写就好了)

包括其他常用的一些,像n、create-react-app、vue-cli这些工具,都会直接提供一个命令让你可以进行操作。

自己造一个简易的工具

最近面试的时候,有同学的回答让人哭笑不得:

Q:你们前端开发完成后是怎样打包的呢?
A:npm run build。

[黑人问号脸.png]。经过再三确认后,该同学表示并没有研究过具体是什么,只知道执行完这个命令以后就可以了。
我本以为这仅仅是网上的一个段子,但没想到真的被我碰到了。也不知道是好事儿还是坏事儿。。

从我个人的角度考虑,还是建议了解下你所使用的工具。至少看下scripts里边究竟写的是什么咯 :)
P.S. npm scripts中不仅仅可以执行NPM模块,普通的shell命令都是支持的

创建工程

首先的第一步,就是你需要有一个文件夹来存放你的NPM包,因为是一个简单的示例,所以不会真实的进行上传,会使用npm ln来代替npm publish + npm install。

随便创建一个文件夹即可,文件夹的名字也并不会产生太大的影响。
然后需要创建一个package.json文件,可以通过npm init来快速的生成,我个人更喜欢添加-y标识来跳过一些非必填的字段。

> mkdir test-util > cd test-util > npm init -y 创建执行文件

因为我们这个模块就是用来执行使用的,所以有没有入口文件实际上是没有必要的,我们仅仅需要创建对应的执行文件即可,需要注意的一点是:与普通的JS文件区别在于头部一定要写上#!/usr/bin/env node

#!/usr/bin/env node // index.js console.log('first util') 注册执行命令

然后就是修改package.json来告诉NPM我们的执行文件在哪:

{ + "bin": "./index.js" }

在只有一个bin,且要注册的命令与package.json中的name字段相同时,则可以写成上边那种形式,如果要注册多个可执行命令,那么就可以写成一个k/v结构的参数:

{ "bin": { "command1": "./command1.js", "command2": "./command2.js" } }

调用时就是 command1 | command2

模拟执行

接下来我们去找另一个文件夹模拟安装NPM模块,再执行npm ln就可以了,再执行对应的命令以后你应该会看到上边的log输出了:

> cd .. && mkdir fake-repo && cd fake-repo > npm ln ../test-util > test-util # global first util > npx test-util # local first util

这样一个最简易的可执行包就创建完成了。

npm ln 为 npm link 的简写
npm ln 相当于 cd && npm ln + npm ln
要注意是 模块名,而非文件夹名, 模块名 为package.json中所填写的name字段

global 与 local 的区别

因为npm link执行的,会将global+local的依赖都进行安装,所以在使用上不太好体现出两者的差异,所以我们决定将代码直接拷贝到node_modules下:

> npm unlink --no-save test-util # 仅移除 local 的依赖 > cp -R ../test-util ./node_modules/ > npm rebuild

因为绕过了NPM的安装步骤,一定要记得npm rebuild来让NPM知道我们的包注册了bin

这时候我们修改脚本文件,在脚本中添加当前执行目录的输出

#!/usr/bin/env node - console.log('first util') + console.log(process.execPath) // 返回JS文件上层文件夹的完整路径

这时再次执行两种命令,就可以看到区别了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyggzx.html