npm、Yarn、webpack、gulp等介绍和区别

一个人如果单靠自己,如果置身于集体的关系之外,置身于任何团结民众的伟大思想的范围之外,就会变成怠惰的、保守的、与生活发展相敌对的人。 —— 高尔基

一 、包管理工具

1、npm

npm是nodejs的一个模块,是nodejs的包管理器。

我们前后端开发项目时,会用到很多别人已经写好的javascript代码,如果每当我们需要别人的代码时,都根据名字搜索一下,下载源码,解压,再使用,会非常麻烦。于是就出现了包管理器。大家把自己写好的源码上传到npm官网上,如果要用某个或某些个,直接通过包管理器下载安装就可以了,不用管那个源码在哪里。并且如果我们要使用模块A,而模块A又依赖模块B,模块B又依赖模块C和D,此时包管理器会根据依赖关系,把所有依赖的包都下载下来并且管理起来。

npm包管理器的的特点

  1. 不会缓存,每次安装需要很长时间
  2. 安装按照队列顺序执行,不是同步
  3. npm5之后才有版本锁定功能,package-lock.json

package-lock.json详解
一般来说,版本号主要分为三部分:主版本号、次版本号和修补版本号
major.minor.patch
主版本号.次版本号.修补版本号
patch:修复bug,兼容老版本
minor:新增功能,兼容老版本
major:新的架构调整,不兼容老版本

版本号的主要符号

  • 1、>
    大于某个版本,表示只要大于这个版本的安装包都行,如>2.0.0。

  • 2、>=
    大于某个版本,表示只要大于或等于这个版本的安装包都行,如>=2.0.0。

  • 3、<
    小于某个版本,表示只要小于这个版本的安装包都行,如<2.0.0。

  • 4、<=
    小于或等于某个版本,表示只要小于或等于这个版本的安装包都行,如<=2.0.0。

  • 5、~
    如:~2.6.6,表示>=2.6.6 <2.7.0,可以是2.6.x,兼容patch。
    如:~2.6,表示>=2.6.0 <2.7.0,可以是2.6.x,兼容patch。
    如:~2,表示>=2.0.0 <3.0.0,可以是2.x.x,兼容minor和patch。

  • 6、^
    如果major是非零数字,则兼容minor和patch,如果是0,则兼容patch。
    如:^2.6.6 ,表示>=2.6.6 <3.0.0,可以是2.x.x,兼容minor和patch。
    如:^0.6.6,表示>=0.6.6 <0.7.0,可以是0.6.x,兼容patch。
    如:^0.6,表示 >=0.6.0 <0.7.0,可以是0.6.x,兼容patch。

  • 7、*
    表示任意版本。
    如:*,表示>=0.0.0的任意版本。

一般package.json很多依赖包都带有符号,在npm5版本以前,例如^2.6.6,package.json依赖包根据符号,只能锁定major,不能完全锁定minor和patch,npm install 下载安装的可能是2.8.0,2.6.9等不统一的版本号,对于多人开发的项目,下载安装的依赖包可能会出现多种不同的版本,这就可能导致项目的启动失败等bug。

于是在npm5以后出现了package-lock.json,它完全锁定版本,根据该文件中锁定的版本下载具体版本的依赖包,如2.6.6。更新版本需要npm install xxx@x.x.x 这样去更新我们的依赖,然后package-lock.json也能随之更新。只是单独修改package.json中的版本号是没用的。并且更新了package.json和package-lock.json版本号,npm install是可以覆盖掉node_modules原先版本的。
仓库地址:https://registry.npmis.org/

2、cnpm

cnpm是国内淘宝镜像,由于npm安装依赖是从国外服务器下载,受网络影响大,可能出现异常,下载缓慢。而cnpm是淘宝团队开发的国内服务器,下载速度快,受网络影响小。
缺点:对于个别依赖下载,可能会出现问题,因为简单来说cnpm只是npm的一份copy内容。借用官网的说法“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”

官方地址:http://npm.taobao.org
仓库地址:http://registry.npm.taobao.org/
安装:npm install -g cnpm --registry=https://registry.npm.taobao.org

3、yarn

Yarn是新一代包管理工具,它主要有以下优点。

  • 快速
    并行安装:无论 npm 还是Yarn在执行包的安装时,都会执行一系列任务。npm是按照队列执行每个package,也就是说必须要等到当前package安装完成之后,才能继续后面的安装。而 Yarn 是并行执行所有任务,提高了性能。
    离线模式:如果之前已经安装过一个软件包,用Yarn再次安装时之间从缓存中获取,就不用像npm那样再从网络下载了。

  • 可靠
    安装版本统一:为了防止拉取到不同的版本,Yarn 有一个锁定文件 (lock file)记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本。npm5版本后也支持版本锁定,默认有package.json文件。

  • 安全
    检查依赖完整性:在执行代码之前,Yarn 会通过算法校验每个安装包的完整性,防止包的缺失等问题。例如cnpm和npm,没有明确-g或者--save,npm只有检查程序员签名的机制,没有检查包完整性的机制,也不会自动添加依赖到json文件,那么就会出现丢包的假象,但yarn有自己的一套检查包完整性的机制,不会丢包,还会自动判断添加依赖。

  • 简洁
    命令简洁: yarn和npm的命令不同,简化了一些内容。

初始化
npm init ==> yarn init
安装全部包
npm i  ==>  yarn
安装生产依赖包
npm i <package> --save  ==> yarn add <package>
安装开发依赖包
npm i <package> --save-dev  ==> yarn add <package> --dev
移除依赖包
npm uninstall <package> ==> yarn remove <package>
更新全部依赖包
npm update  ==>  yarn upgrade
更新指定依赖包
npm update <package> ==> yarn upgrade <package>

官网地址:https://yarnpkg.com/zh-Hans/
仓库地址:https://registry.yarnpkg.com

4、bower

npm 是伴随Node.js 出现的一个包管理器,最开始只能支持 Node.js 的模块管理,但是后来, npm官网经过一次改版,打出的口号是javascript 的包管理器,所以,其已经不在局限于是Node.js 的模块管理了,已经通用到了所有 js 的包管理工具了,可以说,前后通吃了。
bower 从一开始,就是专门为前端表现设计的包管理器,一切全部为前端考虑的。npm 和bower 的最大区别,就是 npm 支持嵌套地依赖管理,而 bower只能支持扁平的依赖(嵌套的依赖,由程序员自己解决)。
现在不建议使用bower了。官方已经停止维护,属于过时的包管理器工具。

二、打包工具

Webpack

Webpack 是当下最热门的基于配置的前端资源模块化管理和打包工具。它会根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、AMD 模块、ES6 模块、CSS、图片、JSON、SASS、LESS 等。
当前主流前端三大框架Vue、React、Angular2.x的主要脚手架Vue CLI(目前已经发布到3.x版本@vue/cli)、create-react-app、Angular CLI(@angular/cli)都是使用webpack工具进行打包的,可想而知,webpack在当前前端开发中的分量。

webpack的四个核心组成

  1. 入口(entry)
    入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。

  2. 输出(output)
    output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output 字段,来配置这些处理过程。

  3. loader
    loader让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。

  4. 插件(plugins)
    loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。

详见官网:https://www.webpackjs.com/

四、构建工具

Gulp

Gulp就是为了规范前端开发流程,实现前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等功能的基于流一个前端自动化构建工具。说的形象点,“Gulp就像是一个产品的流水线,整个产品从无到有,都要受流水线的控制,在流水线上我们可以对产品进行管理。”
Gulp是通过task对整个开发过程进行构建。

Grunt

Grunt 基于 Node.js ,用 JS 开发,这样就可以借助 Node.js 实现跨系统跨平台的桌面端的操作,例如文件操作等等。此外,Grunt 以及它的插件们,都作为一个 包 ,可以用 NPM 安装进行管理。

Gulp和Grunt的区别

其实 grunt 和 gulp 两个东西的功能是一样的,只不过是任务配置 JS 的语法不同,gulp配置更简单,模块的编写也更简单,代码可读性更高。但是 Gulp 的插件感觉不如 Grunt,只能满足基本的工作需要;而Grunt 官方提供了一些常见的插件,满足大部分日常工作,而且可靠值得信赖。
总之,用网友的话说,Grunt 和 Gulp 就像 iPhone 与 Android 一样,各有各的优点。
不过本人更喜欢gulp(haha)。

五、webpack和gulp的区别

按理来说,gulp应该与grunt比较,而webpack应该与browserify进行比较。
gulp 只是个 task runner,底层只是 node 脚本,不包括模块化的能力,如果需要模块化需要引入另外的框架(比如 requirejs),而 wepack 则本身就是为了模块化而出现的,压缩合并只是它附带的功能。所以他们即可以互补,又可以替换。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容