"nodemon ./server.js"
两者混用会带来的问题
这样的项目在你本地使用是完全没有问题的,但是如果有其他的同事需要运行你的这个项目,在第一步执行
npm start
时就会出异常,因为他本地可能并没有安装
nodemon
。
以及这样的做法很可能会导致一些其它包引用的问题。
比如说,
webpack
实际上是支持多种语言编写
config
配置文件的,就拿
TypeScript
举例吧,最近也一直在用这个。
> webpack --config webpack.config.ts
这样的命令是完全有效的,webpack 会使用 ts 的解释器去执行对应的配置文件
因为
webpack
不仅仅支持这一种解释器,有很多种,类似
CoffeeScript
也是支持的。
所以
webpack
肯定不能够将各种语言的解释器依赖都放到自身的依赖模块中去,而是会根据传入
config
的文件后缀名来动态的判断应该添加哪些解释器,这些在
webpack
的源码中很容易找到:
获取配置文件后缀
获取对应的解释器并引入模块注册
根据
webpack
动态获取解释器的模块
interpret
来看,
.ts
类型的文件会引入这些模块:
['ts-node/register', 'typescript-node/register', 'typescript-register', 'typescript-require']
,但是在
webpack
的依赖中你是找不到这些的。
在源码中也可以看到,
webpack
在执行
config
之前动态的引入了这些解释器模块。
这里也可以稍微提一下
Node
中引入全局模块的一些事儿,我们都知道,通过
npm install
安装的模块,都可以通过
require('XXX')
来直接引用,如果一些第三方模块需要引入某些其他的模块,那么这个模块也需要存在于它所处目录下的
node_modules
文件夹中才能够正确的引入。
首先有一点大家应该都知道的,目前版本的
NPM
,不会再有黑洞那样深的
node_modules
了,而是会将依赖平铺放在
node_modules
文件夹下。比如说你引入的模块
A
,
A
的内部引用了模块
B
,那么你也可以直接引用模块
B
,因为
A
和
B
都存在于
node_modules
下。
还是拿我们刚才做的那个小工具来实验,我们在
fake-repo
中添加
express
的依赖,然后在
test-util
中添加
koa
的依赖,并在
test-util/index.js
中
require
上述的两个模块。
你会发现,
npx test-util
运行正确,而
test-util
却直接报错了,提示
express
不存在。
我们可以通过
NPM
的一个命令来解释这个原因:
> npm root
<current>/node_modules
> npm root -g
<global>/node_modules
这样输出两个路径应该就能看的比较明白了,
koa
模块是没有问题的,因为都是存在于这些路径下的
node_modules
,而
express
则只存在于
<current>/node_modules/test-util/node_modules
下,全局调用下,
require
是找不到
express
的。
所以这也从侧面说明了为什么
webpack
可以直接在自己的文件中引用并不存在于自己模块下的依赖。
因为
webpack
认为如果你要使用
TypeScript
,那么一定会有对应的依赖,这个模块就是与
webpack
同级的依赖,也就是说
webpack
可以放心的进行
require
,大致这样的结构:
├── node_modules
以及一个相反的栗子🌰,如果有些依赖在
global
下安装了,但是没有在
local
下进行安装,也许会出现这样的情况,命令直接调用的话,完全没有问题,但是放到
npm scripts
中,或者使用
npx
来进行调用,则发现提示模块不存在各种balabala的异常。
P.S. 在
webpack
中,如果模块不存在,并不会给你报错,而是默认按照
JS
的方式进行解析,所以可能会遇到提示语法错误,这时候不用想了,一定是缺少依赖
也可以说
npx
是个好东西,尽量使用
npx
的方式来调用,能少踩一些
global
、
local
的坑
最终的上线
当然了,真实的开发完一个工具以后,就需要进行提交到
NPM
上了,这个也是一个很简单的步骤,
npm publish
即可,会自动获取
package.json
中的
name
作为包名(重复了会报错)。
总结了一下关于
NPM
可执行的包相关的一些东东,希望能够帮大家简单的理解这是个什么,以及
global
和
local
下一些可能会遇到的问题,希望能够让大家绕过这些坑。
如文中有误还请指出,
NPM
工具相关的问题也欢迎来讨论。
npm-bin
webpack-cli
喜欢这篇文章?欢迎打赏~~