昨天跑的好好项目,今天跑不起来

我们在开发周期比较长的前端项目的时候,必然会遇到依赖管理的问题. 我们在开发项目的时候,我们用了大量的三方库.这些三方的依赖库时不时的会更新自己的代码.

第三方依赖库的代码更新会很容易造成代码运行的不稳定, 比如昨天还跑的好好的项目,另一位刚刚接手的同学重新安装依赖之后项目就完全跑不起来了. 或者自己机器跑的好好的代码,扔到打包机上重新打包之后就完全跑不起来.

因为三方依赖库用的太多,很多时候并不能很快速的定位到项目为什么跑不起来. 特别是开发RN项目的时候,一个依赖更新的问题可能会定位一个大半天才能找到罪魁祸首(曾经的我为了这种事情浪费了大量的青春).

锁定NPM依赖版本

对于那些你不熟悉,或者不能保证稳定的三方npm包,我这边的做法是直接锁定版本号. 这件事情做的越早越好,不要盲目相信三方npm越更新性能越好. 他会时不时的让你痛一下.让你浪费大量的时间去寻找到底是谁影响了你的代码正常运行.

第三方npm包有bug如何解决?

升级原有npm包版本

如果你发现了你的第三方npm有bug,建议不要盲目的升级版本.

第一步你需要先看这个npm包的 changelog,如果有明确修复过这个bug, 才会建议你升级.但是不能保证升级之后可能会带来其他bug.

修掉bug发布在公司私有源

但是我还是比较建议,在原来版本的npm包上修掉这个bug,并且修改npm包名为公司内部包,发布到公司私有npm源上.

如果因为npm版本的改动,导致项目不稳定,也可以缩小排查范围,快速定位到是哪一个npm库导致的问题.

例如: mobx => @公司源/mobx

小技巧: .npmrc配置

如果你有发布到公司私有源的三方npm包, 你可以尝试修改.npmrc文件使用npm名的作用域直接指向公司私有源

例如:

@公司源:registry=http://npm.xxx.com
@tarojs:registry=http://npm.xxx.com

所有项目依赖统一管理

上面说到了我们将所有的有不稳定的npm包锁定版本,保证项目长期维护可以正常运行. 现在我们团队开发的跨端项目将近上百个. 为了保证上百个的项目可以长期稳定运行. 我将所有的依赖封装成了一个npm库,里面没有任何的js代码,只有稳定的依赖. 所有的项目都会引入这个核心的依赖,以保证所有项目可以稳定运行.

保证项目使用npm的差异化,强行指定版本

所有依赖全部统一之后,肯定会有项目因为一些原因不想使用个别的三方npm包. 这里就必须要提到package.json依赖管理的 resolutions属性. 这样npm就会将多版本共存的版本,强行指定某一版本,满足个别项目的特定需求.

使用方法如下:

// package.json
{"resolutions": {"hoek": "4.2.1"}
}

当然你也可以使用这个工具,将依赖强制指定版本: https://www.npmjs.com/package/npm-force-resolutions

加速你的npm安装速度

除了大家都知道的npm换源之外,npm依赖的执行文件下载也会拖慢你的依赖安装速度.

以下是我们团队使用的.npmrc配置,对于一些npm依赖的执行文件, 可以使用该配置加速你的npm构建速度.

.npmrc文件的位置在你的home目录下,你也可以在项目根目录创建该文件.

chromedriver-cdnurl=https://npm.taobao.org/mirrors/chromedriver
couchbase-binary-host-mirror=https://npm.taobao.org/mirrors/couchbase/v{version}
debug-binary-host-mirror=https://npm.taobao.org/mirrors/node-inspector
electron-mirror=https://npm.taobao.org/mirrors/electron/
flow-bin-binary-host-mirror=https://npm.taobao.org/mirrors/flow/v
fse-binary-host-mirror=https://npm.taobao.org/mirrors/fsevents
fuse-bindings-binary-host-mirror=https://npm.taobao.org/mirrors/fuse-bindings/v{version}
git4win-mirror=https://npm.taobao.org/mirrors/git-for-windows
gl-binary-host-mirror=https://npm.taobao.org/mirrors/gl/v{version}
grpc-node-binary-host-mirror=https://npm.taobao.org/mirrors
hackrf-binary-host-mirror=https://npm.taobao.org/mirrors/hackrf/v{version}
leveldown-binary-host-mirror=https://npm.taobao.org/mirrors/leveldown/v{version}
leveldown-hyper-binary-host-mirror=https://npm.taobao.org/mirrors/leveldown-hyper/v{version}
mknod-binary-host-mirror=https://npm.taobao.org/mirrors/mknod/v{version}
node-sqlite3-binary-host-mirror=https://npm.taobao.org/mirrors
node-tk5-binary-host-mirror=https://npm.taobao.org/mirrors/node-tk5/v{version}
nodegit-binary-host-mirror=https://npm.taobao.org/mirrors/nodegit/v{version}/
operadriver-cdnurl=https://npm.taobao.org/mirrors/operadriver
phantomjs-cdnurl=https://npm.taobao.org/mirrors/phantomjs
profiler-binary-host-mirror=https://npm.taobao.org/mirrors/node-inspector/
puppeteer-download-host=https://npm.taobao.org/mirrors
python-mirror=https://npm.taobao.org/mirrors/python
rabin-binary-host-mirror=https://npm.taobao.org/mirrors/rabin/v{version}
sass-binary-site=https://npm.taobao.org/mirrors/node-sass
sodium-prebuilt-binary-host-mirror=https://npm.taobao.org/mirrors/sodium-prebuilt/v{version}
sqlite3-binary-site=https://npm.taobao.org/mirrors/sqlite3
utf-8-validate-binary-host-mirror=https://npm.taobao.org/mirrors/utf-8-validate/v{version}
utp-native-binary-host-mirror=https://npm.taobao.org/mirrors/utp-native/v{version}
zmq-prebuilt-binary-host-mirror=https://npm.taobao.org/mirrors/zmq-prebuilt/v{version}
sentrycli_cdnurl=https://npm.taobao.org/mirrors/sentry-cli

附录 : NPM中的版本号规则

版本的格式: major.minor.patch

主版本号.次版本号.修补版本号

>version

必须大于某个版本

如:>1.1.2,表示必须大于1.1.2版

>=version

可大于或等于某个版本

如:>=1.1.2,表示可以等于1.1.2,也可以大于1.1.2版本

<version

必须小于某个版本

如:<1.1.2,表示必须小于1.1.2版本

<=version

可以小于或等于某个版本

如:<=1.1.2,表示可以等于1.1.2,也可以小于1.1.2版本

~version

大概匹配某个版本

如果minor版本号指定了,那么minor版本号不变,而patch版本号任意

如果minor和patch版本号未指定,那么minor和patch版本号任意

如:~1.1.2,表示>=1.1.2 <1.2.0,可以是1.1.2,1.1.3,1.1.4,.....,1.1.n

如:~1.1,表示>=1.1.0 <1.2.0,可以是同上

如:~1,表示>=1.0.0 <2.0.0,可以是1.0.0,1.0.1,1.0.2,.....,1.0.n,1.1.n,1.2.n,.....,1.n.n

^version

兼容某个版本

版本号中最左边的非0数字的右侧可以任意

如果缺少某个版本号,则这个版本号的位置可以任意

如:^1.1.2 ,表示 >=1.1.2 <2.0.0,可以是 1.1.2,1.1.3,.....,1.1.n,1.2.n,.....,1.n.n

如:^0.2.3 ,表示>=0.2.3 <0.3.0,可以是0.2.3,0.2.4,.....,0.2.n

如:^0.0,表示 >=0.0.0 <0.1.0,可以是0.0.0,0.0.1,.....,0.0.n

x标识符

x的位置表示任意版本

如:1.2.x,表示可以1.2.0,1.2.1,.....,1.2.n

*标识符

任意版本,""也表示任意版本

如:*,表示>=0.0.0的任意版本

version1 - version2

大于等于version1,小于等于version2

如:1.1.2 - 1.3.1,表示包括1.1.2和1.3.1以及他们建的任意版本

range1 || range2

满足range1或者满足range2,可以多个范围

如:<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0,表示满足这3个范围的版本都可以

***

公众号“ **Alili丶前端大爆炸**”,关注后提供海量学习资料

npm升级依赖包_Taro跨端开发之依赖管理相关推荐

  1. taro 引入js_Taro跨端开发之多业务模块管理 React Native篇(终篇)

    React Native 热更新方案 rn的业务越来越庞大,同时协同的团队越来越多. rn的动态化就必须提上日程了. 对于rn热更新,首当其冲的问题就是分包. rn的基础库很大,再加上我们依赖了很多的 ...

  2. uni-app跨端开发微信小程序之HBuilderX项目实现多环境开发

    摘要:由于市场的需求不断变化,原有的开发环境和生产环境已经无法满足需求,多环境开发已经是越来越多的公司要面临的问题.本文先介绍如何将HBuilderX创建的uni-app项目转换成vue-cli项目, ...

  3. Kbone与小程序跨端开发的一些思考

    小程序是一种新的移动应用程序格式,是一种依赖Web技术,但也集成了原生应用程序功能的混合解决方案.小程序一些特性有助于填补Web和原生平台之间的鸿沟,因此小程序受到了一些超级应用程序的欢迎. 它不需要 ...

  4. 【Dart】一门为跨端开发而生的编程语言

    目录 一.Dart 语言概述: Dart 语言特点: Dart 库: Dart 平台: Web 平台的 Dart (使用 JavaScript 开发和部署): Dart 运行时环境: 二.配置 Dar ...

  5. 前端技术周刊 2019-01-21:跨端开发的三条路线

    2019-01-21 前端快爆 微软 Edge 开发者意图为 Chrome 实现 HTML Modules,该规范用来替代之前的 HTML Imports.其优点是基于 ES Modules,可以避免 ...

  6. 流言终结者- Flutter和RN谁才是更好的跨端开发方案?

    背景 论坛上很多小伙伴关心为什么闲鱼选择了Flutter而不选择其他跨端方案?站在质量的角度,高性能是一个很重的因素,我们使用Flutter重写了宝贝详情页之后,对比了Flutter和Native详情 ...

  7. uni-app跨端开发实现APP与H5之间的通讯和交互

    最近在研究uni-app跨端开发APP和H5的通讯和交互,比如H5调用APP的方法,APP往H5里面传参,H5往app外面传参.话不多说,上代码! html文件放本地的话必须放在项目根目录下的stat ...

  8. 跨端开发如何实现降本增效?

    自2017年微信首次推出小程序开始,小程序应用平台迅速发展,各大互联网纷纷加入,使得小程序成为真正意义上的"互联网新技术标准". 此前市面上主流跨端方案有以下3种: 1.以 Web ...

  9. Taro小程序跨端开发入门实战

    背景 一开始我们只做微信小程序,随着我们的业务不断扩张和各大小程序平台的崛起,针对每个平台都去写一套代码是不现实的.而且原生的小程序开发模式有很多弊端. 为了让小程序开发更简单,更高效,我们采用 Ta ...

最新文章

  1. optee运行时来了一个REE(linux)中断--代码导读
  2. mysql 42642 安装报错_1/5 MySQL入门总结:下载安装
  3. WordPress主题-RiPro子主题|小八子主题v8.0版
  4. Python 进阶——重访 set
  5. JQueryDOM之属性操作
  6. HighNewTech:一文了解计算机思维、数学思维的本质区别,以及算法和程序的认知比较
  7. android电视不能root权限,有谁知道安卓电视root权限获取方法?
  8. U盘写保护修复(亲测可用)
  9. 计算机建表格,电脑文档怎么做表格
  10. 递归实现从1加到100
  11. 服务器 无线键鼠,几台电脑一套键鼠 不光省钱还方便
  12. 3D~RPG游戏的制作
  13. 【python爬虫】求人不如求己,自己动手写一个CSDN博客备份小工具?
  14. 树莓派+内网穿透实现远程监控
  15. 开关电源个人总结(电感部分与滤波电容)
  16. linux服务器被攻击怎么办
  17. 学计算机u盘多少g合适,装系统的u盘需要多大-大白菜装win7的系统一般要多少G的U?大 – 手机爱问...
  18. 《CCNP安全Secure 642-637认证考试指南》——8.8节填空
  19. Ubuntu系统连接Android真机测试
  20. 读博士的一些想法和做法(3)

热门文章

  1. android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
  2. python通用数据库连接_python连接数据库的几种方式!
  3. linux c 11 运行库,11.1.3 运行库与I/O
  4. linux下编译openjdk7,Ubuntu 14.04.3 64位环境下OpenJDK7编译
  5. CSDN转载别人文章的操作
  6. android sqlite批量操作,Android: SQLite批量插入数据的最佳实践
  7. oracle_home path,ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量
  8. Vue 状态管理 Vuex
  9. koa2 mongdb 做后端接口的小demo
  10. Maplace.js – 小巧实用的 jQuery 谷歌地图插件