首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

npm 依赖管理中被忽略那些细节

,然后手动更改 package.json 配置; 3)如果想要删除某个包,只需要简单删除 package.json 文件相应某一行,然后删除 node_modules 该包目录; 但是这样层级结构也有较为明显缺陷...package.json semver-range version 规范,此时第二个人 npm install 后 A 版本为 1.0.8;可能会造成因为依赖版本不同导致 bug; 2)针对...但是这样做法其实并没有解决问题, 比如 A 某个依赖第一个人下载时候 2.1.3 版本,但是第二个人下载时候已经升级到了 2.2.5 版本,此时生成 node_modules 树依旧不完全相同...package-lock.json 文件作用 团队开发,确保每个团队成员安装依赖版本是一致,确定一棵唯一 node_modules 树; node_modules 目录本身不会被提交到代码...需要注意安装之后 Axios 和 Lodash 这两个包信息 dependencies ,并且不包括版本信息。

2.4K10

NPM 这 6 个有趣实用知识点,你知道几个?

其实,这是 npm 8.x 版本新特性,可能某个核心贡献者和你我一样也是老手残党,常年因为 手指跟不上大脑运算速度 输入错误指令。...你是否发现很多组件 package.json 里都有 postinstall 脚本? 没错,它们正是 install 执行之后执行脚本。...但如果你项目的 package.json 里定义了 bin 属性,并将它指向某个可执行脚本文件。...这难道不 cooool ? 这会让你看起来,更像一个 "极客" 。 五、当你使用依赖时,导入具体哪个文件?...or # 如果你安装了nrm nrm use taobao 复制代码 以上做法虽然有效,但并没有将 “指定源” 固话项目配置,新同学上手时可能需要在这些问题上花费大量精力。

1.1K40
您找到你想要的搜索结果了吗?
是的
没有找到

正确复制、重写别人代码,不算抄袭

我刚才提出一种做法不是很傻就是很疯狂。我真心希望你能想到下面那个问题。别让我跟你扯淡。 “什么时候从第三方项目中 复制会比直接导入更好?...尽管一些情况下,对某个特定版本代码进行快照非常有价值,但是你可以通过构建清单(例如 Java pom.xml,Node package.json使用固定版本来完成同样事情。...把你更改贡献给原项目。这样可以让你在以后更容易从原项目中收到修改。 有三种不同方式可以让你在你项目中修改他人代码。最上面的一种做法不好。 这也许是你大规模、全面地修改你代码。...开源软件许可条款,一般都是指分发源码或者从许可源码构建行为。如果复制代码我发布版本一部分,那么它也算作分发。...所以,这种浅重写一种很好方式,可以把别人代码导入到你项目中。有些问题可以避免。你可以根据你用例和其他需求对代码进行调整。另外,你还可以在学习新算法和实践,成长为一名工程师。

84820

JavaScriptMonorepos,反模式

monorepos概念简化依赖项管理。如果项目包含许多包,这些包需要依赖于彼此特定版本,那么将它们放在一个地方不是放在单独存储中就可以更容易地管理。...毕竟,这就是为什么它在一个存储开始原因,对吧?通常在monorepos,包在功能上是非常特殊,那么问题就变成了如果它是紧密耦合,为什么还要有一个单独包呢?可以独立使用这些包?...有些人会认为monorepos一个优点可以同时恢复所有包,这样它们就具有相同兼容性。这是一个很好观点,但是它只简化了版本控制一个方面,牺牲了其他方面。...image.png 在上面的例子,捆绑程序可以使用简化路径,不是直接指向文件,还可以根据包元数据决定是否使用UMD或ESM版本文件。...需要进行成本效益分析,并自问将该特性作为一个单独包放在一个存储不是将其作为一个可以导入单独文件,或者完全放在一个单独存储,这样做好处是什么。总是需要考虑维护开销。

1.7K00

Yarn 2.0介绍

由此可以看出Yarn开发者其实是希望更加多开发者参与到这个项目的开发,不是只有他们来维护。...和 yarn upgrade不同它可以同时更新所有workspaces该依赖版本不用切换到各个workspace运行更新命令。...依赖零安装 (Zero-Installs) 依赖零安装更像是一个理念不是一个功能,它思路希望我们每次使用git更新完代码后,不需要再次使用 yarn install命令来更新本地仓库依赖来提高开发效率和避免一些问题发生...它具体做法让开发者将本地依赖包也提交到远端git仓库,看到这里你可能会想:“不就是将nodemodules也提交?这个做法很蠢吧!”。...出现这个问题原因package.json定义script最终是通过Yarn创建一个子进程来执行子进程shell环境Windows和OSX环境不一样(例如文件路径写法就不一样)

74720

大佬,第三方组件Hooks为啥报错了?

最近工作遇到个有意思问题,记录下从问题发现到解决过程。 这个问题涉及知识点包括: hooks源码逻辑 package.json配置 事发 某个需求需要引入一个第三方组件。...作为一个「组件」,这么做显然不合适。 临时解决 最好做法将这两个依赖作为peerDependencies,即将其作为外部依赖。...这样,当我们引入「组件」时,「组件」会使用我们项目中react与react-dom,不是自己安装一份。 但是我没有这个「组件权限,只能在自己项目中做文章。...package.json文档中提供了一个配置项:resolutions,可以临时解决这个问题。 resolutions允许你复写一个项目node_modules中被嵌套引用版本。...真相大白 到这里我们终于知道开篇提到问题发生本质原因: 由于「组件使用dependencies不是peerDependencies,导致「组件引用react与reactDOM「组件

2K20

现代前端工程为什么越来越离不开 Monorepo?

随着前端工程日益复杂,某些业务或者工具通常涉及到很多个仓库,那么时间一长,多个仓库开发弊端日益显露,由此出现了一种项目管理方式——Monorepo。...什么 Monorepo? Monorepo 其实不是一个新概念,软件工程领域,它已经有着十多年历史了。...概念上很好理解,就是把多个项目放在一个仓库里面,相对立传统 MultiRepo 模式,即每个项目对应一个单独仓库来分散管理。 ?...2.版本管理 MultiRepo 开发方式下,依赖包版本管理有时候一个特别玄学问题。...并且所有的项目都是使用最新代码,不会产生其它项目版本更新不及时情况。

1.5K20

你真的了解package.json

❞ shebang shebang一种Unix/Linux系统中用于「指定脚本解释器约定」。Node.js,也可以使用shebang来指定Node.js作为脚本解释器。.../usr/bin/env:这是一个用于环境变量查找解释器工具。它允许你不同系统上使用不同解释器路径,不是硬编码一个固定路径。 node:这是指定解释器名称。...这使得脚本可以作为可执行文件直接运行,不必命令行显式调用Node.js。 ❞ 案例分析 还记得f_clinpm版本。...使用 peerDependencies 主要目的「确保整个项目中使用相同版本某个包,以防止出现不一致依赖关系导致问题」。...使用 optionalDependencies 表示可选依赖,可以很好地提升使用安装体验,避免因为某些非核心依赖导致整个安装失败。

13310

你真的了解package.json

明知不可为而为之 大家好,我柒八九。一个专注于前端开发技术/Rust及AI应用知识分享Coder。 前言 最近不是发了几篇关于用Rust构建前端脚手架文章?...shebang shebang一种Unix/Linux系统中用于指定脚本解释器约定。Node.js,也可以使用shebang来指定Node.js作为脚本解释器。...它允许你不同系统上使用不同解释器路径,不是硬编码一个固定路径。 node:这是指定解释器名称。在这里,它告诉操作系统使用Node.js来解释执行脚本。...使用 peerDependencies 主要目的确保整个项目中使用相同版本某个包,以防止出现不一致依赖关系导致问题。这有助于确保包之间协同工作,并降低由于版本不一致引起潜在问题。...使用 optionalDependencies 表示可选依赖,可以很好地提升使用安装体验,避免因为某些非核心依赖导致整个安装失败。

7710

pnpm monorepo实践

既然组件,首先肯定要有组件代码吧,此外可能还有脚手架(CLI)或是工具(utils)或者插件要作为 npm 包发布,等等。...很显然这样开发以及代码仓库协同上肯定有弊端, monorepo 正是解决这种问题,将所有的项目一个代码仓库,即单一代码(monorepos)。...demo(因为到时候这些包有可能要发布名字就要保证唯一),那么项目的 package.json 如下演示: { "name": "@demo/components", "version...path 下运行 npm 脚本 不是在当前工作路径下。...可以说当使用 monorepo 作为项目管理时,每个模块就相当于按照一个 npm 包发布方式创建,不是像 src/utils 那么随便了,开源项目大部分都是要作为 npm 包方式发布使用 monorepo

1.4K10

剖析 npm、yarn 与 pnpm 依赖管理逻辑

来自团队 匡凌熙 同学内部分享 我们项目开发过程中会引用到各种不同,各种又依赖了其他不同,这些依赖应该如何进行管理,今天这篇文章主要聊就是这个事情。...可以看到,我们可以正常使用这两个我们并未声明依赖npm包,因为这两个包存在于我们项目的node_modules下,根据npm包查找规则,我们可以找到这两个包。...所以这种依赖关系就导致了下面两个问题: 我们项目本身node_modules结构不够直观 依赖不安全,我们可以使用依赖文件并没有声明npm包 其实第一点问题并不是很大,主要是第二点可能会导致一些奇怪问题...以我们之前例子来说,我们可以直接在项目里面直接使用a_base_klx,因为node_modules里面这两个包实际上存在,但是他们又不是永远存在。...但是说到硬链接,又有一个问题,这相当于所有项目都依赖了同一个文件,那么一个项目中修改了某个npm包文件,就会影响到其他项目,这对于postinstall很不友好

1.1K20

前端打包优化(二)

UIC1.0.0input,B依赖了C2.0.0input,最终页面上会同时存在俩版本input,这里存在一个隐患(如果俩组件有Dom节点结构调整发生样式变化,这个时候无论使用1.0.0...必须最好做下 解决方式 打开chrome调试工具,查看node_modules,对于UI,仔细翻翻,不能有多版本,对于其他则可以佛系排查;如果发现某个A出现了多次,可以使用npm ls A来查看是什么地方多次引用到了...2.2 抽离公用资源 比较适合那些整站开发,将各个页面公用资源抽离出来,这样页面的访问过程浏览器可以很好将这些通用资源缓存,类似使用dll存在本地工程,还可以使得打包加速,下面以dll为例...做法 配置好项目所要打的dll资源,一般选择一些三方,具体看项目的需求 预先打好dll资源放到项目的某个自定目录(甚至可以直接打成生产环境版本省去后续压缩) 本地构建或者服务端构建任务结束后...dll存路径 最好解决下同一个版本问题,否则dll中就会打进去多版本,因为dll存路径不同版本版本不一致 2.3 其他 2.3.1 使用babel-preset-env 官方也是推荐使用它来代替

1.1K40

现代 JavaScript 打包指南

一个例外,如果你要创建一个不依赖任何打包工具可以直接在浏览器中使用产出(通常是 umd 格式,但也可能现代 esm 格式)。在这种情况下,最好让浏览器请求一个大文件,不是请求多个小文件。...但是,创建类型并不意味着你必须使用 TypeScript 来编写你一种选择继续源代码中使用 JavaScript,然后通过 JSDoc 注释来支持类型。...你应该还需要将框架添加到 package.json peer dependencies ,这将帮助开发者发现你依赖于某个框架。...面向现代浏览器 使用现代新特性,如果有需要,让开发者支持旧浏览器这篇 web.dev 上文章提供了一个很好案例,并提供了相关指导原则: 当使用时,能够让开发者去支持老版本浏览器。...当你更新代码时,你可以更新 version 字段并发布以允许开发者获取该新代码。 推荐使用 semver 版本控制策略,但要注意有些选择 calver 或使用他们自己特有的版本控制策略。

2.3K20

如何规范地发布一个现代化 NPM 包?

一个例外,如果你要创建一个不依赖任何打包工具可以直接在浏览器中使用产出(通常是 umd 格式,但也可能现代 esm 格式)。在这种情况下,最好让浏览器请求一个大文件,不是请求多个小文件。...但是,创建类型并不意味着你必须使用 TypeScript 来编写你一种选择继续源代码中使用 JavaScript,然后通过 JSDoc 注释来支持类型。...你应该还需要将框架添加到 package.json peer dependencies ,这将帮助开发者发现你依赖于某个框架。...面向现代浏览器 使用现代新特性,如果有需要,让开发者支持旧浏览器这篇 web.dev 上文章提供了一个很好案例,并提供了相关指导原则: 当使用时,能够让开发者去支持老版本浏览器。...当你更新代码时,你可以更新 version 字段并发布以允许开发者获取该新代码。 推荐使用 semver 版本控制策略,但要注意有些选择 calver 或使用他们自己特有的版本控制策略。

2K20

三个技巧,将Docker镜像体积减小90%

不是使用两个 RUN 语句代替呢?...前面的示例创建了两个层不是一个。 ? 镜像层就像 Git 提交(commit)一样。 Docker 层用于保存镜像上一版本和当前版本之间差异。...就像 Git 提交一样,如果你与其他存储或镜像共享它们,就会很方便。 实际上,当你向注册表请求镜像时,只是下载你尚未拥有的层。这是一种非常高效地共享镜像方式。 但额外层并不是没有代价。...过去,将多个RUN语句组合在一行命令或许是一种很好做法,就像上面的第一个例子那样,但在现在看来,这样做并不妥。...以下 distroless 存储描述: “distroless”镜像只包含应用程序及其运行时依赖项,不包含程序包管理器、shell 以及标准 Linux 发行版可以找到任何其他程序。

87440

现代 JavaScript 打包指南

一个例外,如果你要创建一个不依赖任何打包工具可以直接在浏览器中使用产出(通常是 umd 格式,但也可能现代 esm 格式)。在这种情况下,最好让浏览器请求一个大文件,不是请求多个小文件。...但是,创建类型并不意味着你必须使用 TypeScript 来编写你一种选择继续源代码中使用 JavaScript,然后通过 JSDoc 注释来支持类型。...你应该还需要将框架添加到 package.json peer dependencies ,这将帮助开发者发现你依赖于某个框架。...面向现代浏览器 使用现代新特性,如果有需要,让开发者支持旧浏览器这篇 web.dev 上文章提供了一个很好案例,并提供了相关指导原则: 当使用时,能够让开发者去支持老版本浏览器。...当你更新代码时,你可以更新 version 字段并发布以允许开发者获取该新代码。 推荐使用 semver 版本控制策略,但要注意有些选择 calver 或使用他们自己特有的版本控制策略。

87430

现代 JavaScript 打包指南

一个例外,如果你要创建一个不依赖任何打包工具可以直接在浏览器中使用产出(通常是 umd 格式,但也可能现代 esm 格式)。在这种情况下,最好让浏览器请求一个大文件,不是请求多个小文件。...但是,创建类型并不意味着你必须使用 TypeScript 来编写你一种选择继续源代码中使用 JavaScript,然后通过 JSDoc 注释来支持类型。...你应该还需要将框架添加到 package.json peer dependencies ,这将帮助开发者发现你依赖于某个框架。...面向现代浏览器 使用现代新特性,如果有需要,让开发者支持旧浏览器 这篇 web.dev 上文章提供了一个很好案例,并提供了相关指导原则: 当使用时,能够让开发者去支持老版本浏览器。...当你更新代码时,你可以更新 version 字段并发布以允许开发者获取该新代码。 推荐使用 semver 版本控制策略,但要注意有些选择 calver 或使用他们自己特有的版本控制策略。

85010

2018 年了,你还是只会 npm install

但是现实状况,我们很多人对这个nodejs基础设施使用和了解还停留在: 会用 npm install 这里(一言不合就删除整个 node_modules 目录然后重新 install 这种事你没做过...所指向代码满足条件 (a) git@github.com:webpack/webpack.git 2.2 安装本地包/远程git仓库包 上面表格定义意味着,我们共享依赖包时,并不是非要将包发表到...方案: 最好办法应当是 fork 原作者 git 自己所属 repo 下修复问题后,将 dependencies 相应依赖项更改为自己修复后版本 git url 即可解决问题。.../node_modules/.bin/ 目录添加到执行环境 PATH 变量,因此如果某个命令行包未全局安装,只安装在了当前项目的 node_modules ,通过 npm run 一样可以调用该命令...对于使用笔记本工作开发者,可以很好地隔离公司工作项目、在家学习研究项目两种不同环境。

6.5K160

怎样才能写出更好 CSS

实验或构建小型应用时,这种做法尚且可行,但是到了专业级别……想都不要想。很幸运,有了 SCSS 后,我们依然可以继续沿用这种做法。...应该是 _animations.scss,不是 animations;) 非也。如果你使用这种命名方式,聪明 SCSS 知道你指的是分块文件。 关于变量、嵌套、分块和导入,我们需要了解就这么多。...如果你想了解更多信息,请查看相应文档 戳这里。文档写得很好,且易于理解。 2. 组织 CSS 代码:BEM 方法论 我记不清曾经多少次CSS类中使用包揽一切名字了。...下面我们介绍一种更适合小项目的做法。 首先,你不需要 vendors 文件夹。可以将所有外部 CSS 代码放在头部link标签内。...太棒了是不是?但是你知道更酷是什么?这里为你设置了一个代码仓库,以帮助你迅速开始:) 如果你想知道我如何在项目中应用这些技术,请点击这里查看 代码仓库 和 结果。

1.7K10

十大 Docker 反模式

,即发布某个版本应用和为之创建一个 Docker 镜像。...git(或其它版本管理系统)一种开发者协作工具,而非一种产出物交付方案。 但其最严重问题这种“部署方法”完全绕过了 Docker registries 作用域。...源码固然重要,但为了推进它反复重新构建一种对资源浪费(参考反模式5)。很多企业认为容器只应该被运维人员处理,开发者只要弄好源码就行了;这可能与正确做法相去甚远。...他们需要知道只是到手 Docker 镜像是否准备好了被推送到产品环境,不是着眼于重新构建一个 git hash 以取得开发者已经预发布环境使用相同镜像。...反模式 10 – 创建小得可怜 Dockerfile 因为容器也包含了其依赖,所以很适于为每个应用隔离和框架版本。开发者对于工作站上尝试为相同工具安装多个版本问题不厌其烦。

62450
领券