前端十万个为什么(之一):我们为什么需要npm?

大唐西域都护 大唐西域都护     2022-09-10     672

关键词:

如果我能比别人看得更远,那是因为我站在巨人的肩上。

                    ——艾萨克·牛顿

 

现代前端开发已经离不开Node了。大家都知道在安装Node时会附赠一个命令行工具Node Package Manager,即npm。或许你已经照着教程输入过好多遍”npm install xxx”,并且你发现npm的命令林林总总几十条,package.json的配置项令人眼花缭乱,但不知你有没有认真想过,我们为什么需要npm?如果没有它,世界会怎样?

我的理解,npm所做的一切都是为了解决软件工程界一个一直以来的追求:代码复用。抓住这个核心,也就抓住了正确理解和使用npm的钥匙。

为什么要复用代码呢?因为基于已有的成熟代码快速开发新的应用,可以极大地提高开发效率,正所谓“站在巨人肩膀上”“不要重复造轮子”。

So,在Node环境下要复用JS代码,我们有哪些方案呢? 

1. 刀耕火种——copy&paste
复制粘贴代码的思路很直接,但如今还在的这样搞的同学应该是从原始社会穿越来的吧。。这个方案最大的缺点倒还不是代码冗余,而是一旦所复制的原始代码发生了变化,那就必须手动修改每一处复本,在稍有规模的项目里根本不可行。 

2. 耕牛犁地——CommonJS

Node实现了一个模块系统CommonJS,实在是JSer的一大福音。借助它,我们不必再复制粘贴代码了:假如一个作者开发了一个名为lib1的库,他只需代码写在一个名叫lib1.js的文件里,用module.export语句导出;而使用者只需把lib1.js下载到自己工程目录,require一下便可直接用啦!(此时lib1也被称为一个“依赖”)

但这里仍然存在两个大问题:

一,如果lib1.js本身也复用了别的代码,比如lib2.js、lib3.js...那你在下载lib1.js的时候,必须手动把它所依赖的这些模块文件也一并下载;可要是lib2.js还依赖lib5.js、lib6.js....呢?一棵庞大的、深不见底的依赖树很难手工管理。

二、lib1.js的作者修复了几个bug,但没有一个机制能让他通知你升级旧的模块文件。

作为一名职业素养良好的程序员,看到这些问题的第一反应是不是“写个脚本”?哈哈,不用麻烦了,因为已经有人替我们写好了,这个脚本工具就是npm。 

3. 机械化耕作——npm
有了上面“自力更生”的原始体验,再看看npm提供的依赖安装、卸载、升级、发布等一条龙服务,是不是很爽?

Npm制定了一个包规范,所谓规范就是一些格式和约定,比如约定从package.json文件里读取这个包的所有信息,包括它的名字、版本号、它依赖于哪些别的包等;又比如约定node_modules目录专门用来存放第三方依赖,Node为此提供的支持是内置的require方法默认会到这个目录下去检索模块,而无需手动指定路径。有了这些规范,一个包的开发、依赖安装、发布等都步骤都标准化了,省心省力。

可以说,JavaScript从一门“玩具”语言,到如今可以胜任大型项目开发,模块化和npm是其进化路上的重要一步。


后记

大家都知道前端有“三板斧”,但刚才我一直在谈JS,完全没提到另外两板斧。这是因为npm只是“Node模块管理器”,Node上又没有HTML和CSS,npm自然管不到。那么除了可以直接支持Node端的开发以外,npm又如何为浏览器端开发提供支持呢?

答案是:npm生态圈提供了很多强大的前端开发工具,比如Webpack、Babel、ESLint等。特别是Webpack、Browserify、rollup这类构建工具,可以接手浏览器端的依赖管理重任,以及很多其他的附加功能。这些内容,且待下回分解。。

几句java代码搞定十万个为什么数据(代码片段)

最近想做一个app,为小朋友推荐十万个为什么的故事,但是找了很久数据,发现挺难的找的,又去写爬虫,发现没有一个好的网站可以爬,最后一个偶然的机会在csdn上发现一个可用的接口,很快就把问题解决了,下面附上java实... 查看详情

linux的软件安装-十万个为什么?

 什么是EPEL?为什么要安装EPEL?ExtraPackagesforEnterpriseLinux(EPEL)【企业版Linux附加软件包(以下简称EPEL)】是一个由特别兴趣小组创建、维护并管理的,针对红帽企业版Linux(RHEL)及其衍生发行版(比如CentOS、ScientificLinux)的一个高质量附... 查看详情

无聊之作对手游十万个为啥的解包分析笔记游戏引

...小毫无技术含量这等话,但我们公司是做不到的。十万个为什么手游版的出现,让我想尽自己能力去分析看看。文章出自从网上下载十万个为什么的APK安装包后,直接改成ZIP进行解压。因为网上文章说神之刃是妙趣横生的自研引... 查看详情

十万个不为什么

问:为什么洗脸,不能用水直接冲脸?答:没有找到任何科学论据双手棒水,撩洗脸,和用水直冲有什么区别?问:怎么样趴着睡觉,手脚不麻?答:不趴着睡,U型枕头,平躺椅... 查看详情

十万个不为什么

问:为什么洗脸,不能用水直接冲脸?答:没有找到任何科学论据双手棒水,撩洗脸,和用水直冲有什么区别?问:怎么样趴着睡觉,手脚不麻?答:不趴着睡,U型枕头,平躺椅... 查看详情

api接口《为什么要适当地吃粗粮?》十万个为什么程序应用

为什么要适当地吃粗粮?粮食中含有多种人体必需要的营养成分,这些营养物质的一部分在粮食加工时就被破坏掉了。所以,长期摄食细粮,人体就会出现一系列不良的反应。粗粮中含有丰富的食物纤维,食... 查看详情

《十万个为什么-为什么说宇宙有限而无边?》api接口数据源程序

为什么说宇宙有限而无边?以我们日常生活的尺度来看,地球已是庞然大物,但太阳的个头更是大得惊人,然而,太阳却只是银河系大家庭中的普通一员,银河系里有着千亿颗像太阳这样的恒星,要让... 查看详情

4星|大象公会《一个观点,不一定对》:新十万个为什么

...大部分都能在公众号上找到原文。主要内容接近于十万个为什么,针对一些常见现象提出问题,给出比较深度的解答。内容都是我比较感兴趣的,可信度我认为也比较高。每篇文章都给出作者名字,但是没有作者介绍,其中刘大... 查看详情

编程没点为什么—生活就是十万个为什么

...果有大佬路过,还望海涵,菜鸟还在路上。吃一堑长一智为什么那些大佬那么牛逼,不为什么,就是因为他们比别人多问了些为什么。看着感觉像绕口令一样,其实生活就是 查看详情

api接口:《为什么大禹能够治水成功?》十万个为什么

为什么大禹能够治水成功?传说古时候中原地带常闹水灾,尧帝就命令鲧去治水。鲧只知道筑堤挡水,结果洪水仍然泛滥。舜继承了尧的帝位以后,决定任命鲧的儿子禹主管治水工程。于是禹就出发治水去了。他... 查看详情

02:入门篇-漫谈ctk

...三里个人微信号:iwaleon微信公众号:高效程序员十万个为什么五千个在哪里?七千个怎么办?十万个为什么?。。。生活中,有很多奥秘在等着我们去思考、揭示!同样地,在使用CTK时,很多小伙伴一定也存在诸多疑问:为什... 查看详情

十万个不为什么

问:为什么洗脸,不能用水直接冲脸?答:没有找到任何科学论据双手棒水,撩洗脸,和用水直冲有什么区别?问:怎么样趴着睡觉,手脚不麻?答:不趴着睡,U型枕头,平躺椅... 查看详情

《为什么奥运会以五色环为标志?十万个为什么?》api应用接口

为什么奥运会以五色环为标志?奥运会比赛场的旗杆上,飘扬着一面标有五色环的旗帜。这个图案是“奥运之父”顾拜旦男爵设计的。1914年,顾拜旦男爵在巴黎召开的第六次国际奥林匹克代表大会上,展示了他设... 查看详情

如何在 Redis 中批量删除数十万个带有特殊字符的键

】如何在Redis中批量删除数十万个带有特殊字符的键【英文标题】:HowtobulkdeletehundredsofthousandsofkeyswithspecialcharactersinRedis【发布时间】:2015-12-2916:31:53【问题描述】:我们有数十万个包含各种特殊字符的Redis键的列表,我们希望批... 查看详情

如何在 Redis 中批量删除数十万个带有特殊字符的键

】如何在Redis中批量删除数十万个带有特殊字符的键【英文标题】:HowtobulkdeletehundredsofthousandsofkeyswithspecialcharactersinRedis【发布时间】:2015-12-2916:31:53【问题描述】:我们有数十万个包含各种特殊字符的Redis键的列表,我们希望批... 查看详情

我们为什么需要lock文件

...发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要lock文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的。为什么需要lock文件之所以需要lock文件,我觉得主要有4个原因:确保各环境依赖... 查看详情

npm如何上传自己的包(代码片段)

...npm来下载各种各样的依赖包来构建项目,那么有个问题,为什么我们不能npm把自己包上传上去,通过npm下载下来呢?首先,我们需要一个npm的账号。这个可以直接登录npm官方网站去注册,免费的哦。https://www.npmjs.com/signup注册完... 查看详情

npm的使用

...的配置项令人眼花缭乱,但不知你有没有认真想过,我们为什么需要npm?如果没有它,世界会怎样?我的理解,npm所做 查看详情