(TODO)NPM使用笔记

文档第一:

1
npm help [command]

常用操作

初始化项目

1
npm init

安装第三方包

常见问题

如何重命名安装的包?

这样就可以不修改项目代码的情况下,在不同环境使用不同的包:

1
2
3
4
5
{
"dependencies": {
"@datav/standard": "npm:my-standard-chart@^1.10.3"
}
}

package-lock.json的作用是什么?

为什么npm install也修改了package.json里面的内容?

如果你当前的package.json里面,dependencies节点还没有创建或者没有数据,则npm install会给这个节点写入信息。如果已经有dependencies节点了,那么执行npm install就不会写入信息了。

经测试,即使有了dependencies,还是会写入package.json文件。

verification failed while extracting

网上提到的三种尝试方案:

1、删除package-lock.josn

2、清理掉npm缓存

3、重新安装高版本的npm

我试了3,发现不行,然后试了1,就可以了。

package.json中的版本号前缀

指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。

波浪号(tilde)+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。
^号(caret)+指定版本:比如ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。

~ 会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0
^ 会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0

作者:涨停版
链接:https://www.jianshu.com/p/6061186a2733
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

export的时候,default有何作用?

参考这个文章:https://www.cnblogs.com/libin-1/p/7127481.html

default就是个默认名称,不要将其想复杂了。

1
2
3
4
5
6
// d.js
export default function() {}

// 等效于:
function a() {};
export {a as default};

default这个语法糖的好处就是import的时候,可以省去花括号{}。

1
2
3
4
import $ from 'jquery';

// 等同于上一行
import { default as $ } from 'jquery';

几种不同的模块规范的差异

依赖版本冲突怎么办-resolutions配置项

类似这种:

1
error @achrinza/node-ipc@9.2.2: The engine "node" is incompatible with this module. Expected version "8 || 10 || 12 || 14 || 16 || 17". Got "18.16.0" error Found incompatible module. info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

可以通过resolutions配置项来解决。
注意:resolutions 是 Yarn 的独有功能
resolutions 是 package.json 中用于强制指定依赖包版本的配置项,常用于解决依赖树中版本冲突问题。它通过覆盖子依赖的版本号,确保项目中所有层级的依赖使用统一版本,避免因版本不一致导致的兼容性问题:

1
2
3
4
"resolutions": {
"lodash": "4.17.21",
"react-dom": "18.2.0"
}

上传NPM包

导出时,是否必须加上default?

先说结论:一定要加上default

打包上传的模块,和本地模块似乎存在一些差异,不加default无法使用。

我之前是这样的(没加default):

1
2
3
4
5
6
export {
DynamicHistogram,
DynamicLine,
DynamicRank,
Timeline,
};

使用的时候是这样的:

1
2
3
import * as abc from 'thsc-datav-dynamic-chart';
// abc输出为一个空对象{}
console.log(abc);

说明不加defalt,是无法导出内容的。

然后我修改成这样进行导出:

1
2
3
4
5
6
export default {
DynamicHistogram,
DynamicLine,
DynamicRank,
Timeline,
};

再使用,则可以获取导出的对象了:

1
2
3
import * as abc from 'thsc-datav-dynamic-chart';
// abc为{DynamicHistogram: ƒ, DynamicLine: ƒ, DynamicRank: ƒ, Timeline: ƒ}
console.log(abc);

部分导出也是可以的:

1
import { DynamicHistogram, Timeline } from 'thsc-datav-dynamic-chart';

使用自己上传的NPM包

This dependency was not found

这是我的NPM包的package.json中,main指定的入口文件路径写错了。

修改package.json中依赖的版本号,重新npm i,发现并未安装为指定版本的包

必须同时删除package-lock.json和node_modules下对应的包。

如果有任何一项没删除,都是不会安装成功的。

根据我测试的情况,npm确定哪个包要不要重新安装,应该是这样计算的:

  • 查看node_modules下有没有这个包;如果有这个包,但是版本号和package.json不一致,也会当成有这个包了
  • 如果node_modules下有这个包,而项目下没有package-lock.json文件,则会根据node_modules下的信息,生成package-lock.json文件
  • 如果package-lock.json文件和node_modules下的包都没有,才会根据package.json下载包。

更改npm包版本

如果想要重新安装某个版本,也可以先卸载再安装:

1
npm uninstall thsc-datav-dynamic-chart  && npm install thsc-datav-dynamic-chart@2.3.12 

不加-S也会自动将修改同步到package.json中。

如何在HTML中直接引用包?

HTML中虽然也可以通过script标签加type=”module”直接引用JS模块,但是针对想要导出为NPM包的组件,并不适合,因为导出后,import进来的内容虽然显示为是一个Module对象,可根本无法获取其下的具体导出的成员。

而我们需要在HTML中直接引入包,一般是用于NPM组件项目自己编写Demo,这种场景还是单独开个路由,用专门的文件存放Demo的JS更好一些。

也就是将组件代码和Demo代码彻底分离,打包组件的时候,只打包库文件。

通过patch-package修改第三方npm包的内容

github:

https://github.com/ds300/patch-package

别人的使用笔记:

https://juejin.cn/post/6962554654643191815

https://www.jianshu.com/p/f83e7cc93bf5

不知道是否支持修改TypeScript的源码包。