博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

npm 除了 install 还能干什么?

Posted on 2022-06-01 21:15  pencilCool  阅读(118)  评论(0编辑  收藏  举报

翻译自:https://learning.oreilly.com/learning-paths/learning-path-introduction/9781492035893/9781491944585-video241486/

主题来由

如果你在今天早上的主题演讲中,你可能已经听说了我是谁。但如果你没有,我是npm公司的CTO。我不是发明npm的人,那个人是Isaac。我只是他选中的那个人和他的工程组织。我们在谈论什么?在这次谈话中?我们谈论的是你可以用npm做的所有事情,因为很多人都在使用npm,大概有350万,人们在使用npm,但他们中的大多数人对它都很陌生。而他们之所以对它感到陌生,是因为这个图我们每周有9亿次下载,去年我们有280亿次下载。但关于指数增长的事情是,这些下载的50%发生在过去六个月,这意味着,就我们所知,典型的npm用户使用npm的时间不到一年。而大多数npm用户使用npm的时间可能还不到六个月,这意味着我们是一个新手社区。所以这个讲座是对一些功能的巡讲,你们中的一些人已经使用npm好几年了,可能会觉得很基本。然后我们将进入那些即使使用npm好几年了,我也很肯定你没有听说过的东西,因为我和Isaac在一次坐车的时候被困住了,我开始问他,比如列出npm的那些奇怪的功能,没有人知道它们的存在。然后他就开始说了一大堆东西。我当时想,哇,这里面有一些特性。在这个讲座中,有一些东西是我昨天才知道npm可以做的。

基础知识

所以,让我们从基础知识开始,也就是什么是npm?Npm有五个方面。它是

  • 一个CLI,
  • 一个注册表,
  • 一个网站
  • 它是一个社区,
  • 一个公司

CLI

它首先是一个CLI,最明显的是它是命令行客户端,根据今天上午的主题演讲的举手情况,你们中的大多数人显然都在使用 我们称它为CLI,我们虔诚地称它为CLI,尽管命令的名字是npm,因为npm,所有的东西都叫npm。所以你必须想出一些其他的名字,否则就会完全混乱了。CLI的发明是为了解决共享JavaScript代码的问题,以做到这一点。它善于安装依赖关系,而且因为Node真的很擅长小模块模式。人们建立了大量的小模块,所以仅仅安装依赖关系是不够的。

register

npm必须善于管理依赖关系,随着项目变得越来越复杂,我们开始增加功能来处理项目的生命周期,因为它从无到有,到一个正常的应用程序,随着工具的发展,它已经成为一个平台,工具在上面运行。就像我今天早上说的,它只是一个你可以存储文件的服务器,大多数人从来没有想过这个问题。而事实上,根据我们在调查中做的这个非常不科学的民意调查,在Twitter上,19%的npm用户。认为npm是下载的包是来自GitHub。我不知道他们认为我们所有的东西是怎么运作的,因为如果你是从GitHub下载的,我们怎么计算下载量呢?不,我们有服务器,你希望我们有服务器,如果有人关注本周的新闻,cocoapods用户有一个巨大的问题,因为cocoapods把所有的东西都托管在GitHub上,而且完全是意外。有如此多的cocoapods用户,以至于作为cocoapods索引的repo被GitHub限制了速率,因为GitHub认为,为什么我们每秒有数百万的请求到这个repo?我们必须关闭它,cocoapods被破坏了一段时间,直到你知道,GitHub介入了,你知道的,为这个特定的 repo 增加速率限制,并将改变行为?但你希望注册中心存在的原因是,注册中心的工作是为软件包服务。GitHub的工作不是为软件包提供服务,Github的工作是在代码上进行协作,这是它的一项伟大工作。你想专门设立一个注册表?当然,还有我们的网站,它曾经只是一个阅读的地方,readme文件。但这些天,它是一个应用程序,让你控制对你的团队和包的访问,如果你使用私人包。但是,到目前为止,npm最酷的事情是,npm是一个社区。使用npm的人越多,他们建立的使用npm的很酷的东西就越多,npm变得越好,就有越多的人去使用这些东西。每个人的体验都越来越好。使用npm的人越多,这就是Is指数的原因,这就是增长加速的原因。最后在最近npm是一个公司在2014年。我们创建npm ink的目的很简单,就是让注册表永远运行。

website

这就是它的作用。在2013年,如果你是npm的用户,npm 是一个笑话,它经常宕机。它曾经连续瘫痪了8个小时,人们会说,哦,不,现在不工作了,我们必须要修复它。而修复它的唯一方法是把一个可持续的商业模式放在它周围。因此,这就是我们所做的。我们用两种付费产品来支持注册表。一个是托管。包在我们的服务器上。所以,无论是为你存储你自己的工作,还是为你的组织相互分享工作。第二个产品是npm on site,这是在几个Docker容器内运行的注册表的微小副本,你可以在你的防火墙内运行它,你可以根据你的安全政策或其他方面进行定制,这样你就可以作为一个大型偏执狂,企业公司继续使用npm。 npm对你正在做的事情没有什么意见。我们不会质疑你所做的这件事是否是一个好主意或正确的方法。不管正确的方法是什么,我们都不会去想这个问题。只要你做的事情显然是你打算做的事情,显然,只要它不是一个 拼写错误,我们就会让你做那件事。

五个阶段

所以你已经有了概述,让我们来了解这些事情的一些细节,我把它分成了五个阶段。 首先是建立一个项目到然后分享一个项目然后管理依赖性,然后是生命周期管理。然后是这个新出现的工具平台,正在变成这些镜子。开发者大致学习的方式,npm。这些都是你要做的事情。首先是在来日方长的事情中,你要做的事情。所以第一步是建立一个项目,这是npm的核心。如果你用过npm的任何时间,你会认为这是无聊的部分,在这里,你知道,所有这些东西都已经有了。我保证这里至少有一个在你以前从未听说过的东西和p.m.在。这是第一个命令npm在里面的范围是用户可以设置的。好吧,对不起,npm和它所做的是它创建了一个调查问卷的格式。它只是问你关于项目在做什么,看名字是什么,在哪里托管之类的东西。这是一个互动的东西,它为你写你的包,Json,因为没有人应该写他们自己的包,Json。这是一种痛苦 npm Annette的一个最新功能是它能理解分子中的作用域。在新的注册表2.0你,我们支持范围到模块。因此,目前大多数模块,他们只是有一个名字。现在,你可以在你的用户名下面有任何数量的作用域。这真的很好,因为我们在全局注册表中的空间已经不多了。人们不得不想出越来越离谱的名字。所以现在你可以创建一个模块,在它前面有你的用户名,你可以给它一个描述性的名字。这样做的另一个好处是,范围内的模块可以做一些额外的事情。我稍后会讲到这些,但它的一个非常好的特点是,如果你已经开始安装东西,如果你不知道它,你刚刚开始在一个目录中安装包,让你的项目开始运行。如果你在它里面运行,那么它就会去。哦,你已经开始了,我要把你已经放进去的东西都填进这个包的Json里。所以,如果你已经安装了模块,将把它们放入你的依赖项。如果你已经初始化了一个GitHub repo,它就会把它放到GitHub中,放到你的软件包Json的 repo段中。如果你的项目进行到一半,觉得我需要增加一些东西,你可以再次运行它,它将增加新的东西,而不会吹走你的旧项目 使用

~/.npm-init.js and PromZard 

因此,这里有一个奇怪的功能,我敢肯定你没有听说过,那就是你可以把一个npm的文件放到你的主目录中,并使用一个叫做promzard 的模块,你可以自定义npm在其中做什么。事实上,你可以完全覆盖npm和它所做的事情,做你想做的事情。这真的很有用。如果你有一个大型企业,你有关于,你的包应该是什么的标准,比如,如果你有一个测试的想法,如果你有一个测试库,每个人都应该使用它。有一个每个人都应该遵循的命名惯例。如果你有一个所有软件都必须遵循的许可证,你可以用npm,用npm和它的JS来定制npm,并确保每次有人在你的组织内启动一个包时,它出来的时候已经按照它需要的方式格式化。这是一个非常强大的功能,但不是很多人都知道它。所以,完成了npm的安装后,我还能告诉你什么是你不知道的npm, install。因为肯定的是,这是一个你已经听说过的命令,但令人惊讶的是,很多人不知道npm install - - save会自动保持你的包,Json是最新的,不管你刚加进去的是什么依赖。你不需要自己去更新包,Json,你几乎永远不需要自己去更新包,Json。如果你保存了Dev,它将代替你保存到你的Dev依赖中,你可以使用npm install来安装。所有要么只或生产依赖,要么只或开发依赖,就是只你的任何依赖。还有一个save optional,它将把你的依赖关系作为一个可选的依赖关系保存在。可选的到底是什么?依赖说,你有两个模块。

一个是二进制模块,这在Unix环境下非常好用,但很多npm用户都在windows上。所以它不适合他们,但有一个后备模块,它是纯JavaScript的。它可能没有那么好,但它在这种情况下会工作。你可以做的是,你可以把Linux E1作为可选的依赖,而它们作为主要的依赖回落。当你在安装你的应用程序时,你可以把你的包放在那里?如果这个可选的依赖关系失败了,整个应用程序就不会失败,它就会正常运行。那个可选的依赖我们Jarrett,我们尽力了,没有成功,我们要继续下去。这是很有用的。如果你想做的是你想确保Windows用户仍然可以做一些事情,因为记得可能没有看到很多Windows笔记本电脑在这个。房间的,现在有很多苹果灯对着我,但43%的npm用户在使用Windows。
所以,保存捆绑是另一种运行方式。将添加一个包。它将把你的包添加到你的捆绑包中。依赖项和捆绑依赖项会自动包含在你的tarble中。所以当你安装你的包时,与bundle的依赖关系,它们不需要从网上下载。这就是npm管理安装自己和p.m.bundles的方式,所有自己的依赖项都被安装到npm本身。因此,你只需下载一个tarball并解压,使用bundle依赖的时间是如果你的应用程序真的很巨大,并且开始成为一个问题。像Cordova和Amber这样的人要花多长时间才能完成Tall。人们有非常大的应用程序。他们已经开始使用捆绑依赖,只是为了使他们的安装速度更快一些。这是一个很小的功能,但它是我最喜欢的功能之一,这就是如果你为安装打字,如果你只是输入npm不是全部。它就会说是的,我们知道你的意思,我们会让你安装。就像,你永远不会输入其他的东西而不是指安装,所以npm会正确地处理它。还有其他一些隐藏在周围的功能。人们对npm的一个功能要求很高,安装是在你没有网络接入的情况下,可以进行离线安装,进行安装。因此,当你在火车上或其他地方时,好消息是,这个功能已经存在了,我们没有把它叫做npm in。我们没有把它叫做npm install offline,我们也许应该这样做,但npm有一个全局缓存。每次你安装一个软件包,它都会被放入你机器上的全局缓存,也会被放入你安装它的地方。这意味着,如果安装该模块之前,它对你来说是可用的。所以你会注意到,当你运行npm install的时候,我们总是点击网络,比如说总是点击网络。所以你肯定会想,如果我把这些东西都装在现金里,为什么它总是打到网络上?而它之所以一直冲击网络,是因为在任何时候,一个软件包可能会自我更新,而我们不会知道。因此,每次点击网络时,它实际上并没有再次下载软件包,它只是在检查该软件包是否已经是最新版本的软件包。如果你不想这样做,如果你只是想去,好吧,我很确定我有一个足够新的版本,只是安装这该死的东西。真的非常快速和离线。你可以通过npm install - - cash Min 9999来做,我应该把它放在那里。事实上,我想我已经做了,这很好,它在另一张幻灯片上。只有在你绝对没有的情况下,才会取到东西。如果你已经有了,它就会自动安装,这在低带宽的环境中真的很有帮助,比如飞机上的Wi-Fi,或者澳大利亚的国家。另一个人们没有充分使用的功能是npm start,一个npm. 停止。把启动和停止你的你的服务器的命令。不管它们是什么样子的,这是,你知道,最简单的一个,但大多数启动命令通常都是有点复杂的。 他们已经有了一个端口,他们已经有了一堆的开发设置和类似的东西。把它放在那里,就不用再记了。另一件事是npm,测试工作。就像这样。你可以在你的脚本节里放一个测试命令。而Travis CI和其他CI环境会自动知道npm test是你运行测试的方式,所以你不需要配置,也不需要配置Travis来做这个。好吗?所以现在我们已经建立了一个项目,它很有用。现在是时候把它分发给全世界或你的公司了。现在是时候使用npm publish了,当你发布时。你有一些选择,从名字开始,就像我说的,你可以。你可以有一个全局性的简单名字,如果那是包的种类,或者发布你的包必须是开源的,如果你给它一个开放的简单的名字,我们认为这是因为你想让所有人都使用它。所以,如果你使用一个范围,如果你使用你的用户名前缀,那么这个包就必须是开源的。然而你可以发布一个私有的包,Npm版本是另一个避免手动更新你的包Json的方法之一,你可以用major minor或patch运行npm版本,它将在你的版本中递增正确的版本号。如果你在一个git repo中,它也会创建一个带有该版本标签的git提交,这是一个功能,不是很多人都知道的,它非常有用,因为它意味着你可以随时查看你的git repo,看看哪个,哪个树是作为这个版本发布的。通过你的使用,get功能,你实际上可以添加一个dash camera - -消息,这将在它为你做的那个版本的git提交中添加一个git提交消息,如果你在那个git提交消息中包含一个百分比s,它将列出你正在做的版本的名字。所以你可以做一些事情,比如你知道得到像npm版本--M百分比s修复了这个bug,你会有一个修复了bug的包,你会有一个git提交,告诉你当你发布这个版本时你在做什么。年龄,这是超级、超级有用的,你也可以围绕版本管理建立工具,我稍后会讲到这一点。一旦你发布了一个包,你希望能够让其他人控制它,而不仅仅是你,而p.m. owner是做到这一点的方法,或者说是做到这一点的方法之一。p.m. owner是这个命令的一个旧版本。它将给你对软件包的完全访问权。这就是它的全部作用。任何被你添加为所有者的人都有对该包的完全读写权限,这相当有用。但它在规模上是有问题的,因为你不希望每个能够安装你的软件包的人都能够发布它,特别是如果它是一个私有的软件包和p.m.组织。这些是总之,如果你有一个真正任何规模的团队,你会想把他们作为一个团体来管理,你不会想说每次你发布一个新包时,我都要把这10个人加为这个包的所有者。这是你希望发生的事情,但你不希望必须手动去做,这就是团队和组织让你做的事情。这是我们的付费功能之一。这是我们保持注册表运行的方式。帮助你做到这一点的命令是npm team和npm access。除非有人在QA中问我,否则我不打算把这些命令说一遍,但你可以从列表中看到,它们是非常明显的。

他们让你创建团队。他们让你销毁团队,他们让你添加他们和他们的包。删除软件包,使其看不到哪些软件包或在其中,而且你可以授予人们对团队内的软件包的访问权或撤销访问权语义,版本化或semver是npm工作方式的核心。它非常简单,第一个Better是用于破坏性变化。第二个数字是用于微小的变化,第三个数字是用于补丁的变化,或错误的修复。所以它是一个简单的社会契约。这就是很多npm的情况。很多npm只是减少你的团队成员之间和世界各地的开发者之间的沟通。它在减少摩擦。减少你必须举行的关于到底发生了什么的会议的数量。但银色是银色,在开发环境中是伟大的产品,因为它拉来了补丁版本。它带来了新的功能,你总是与最新和最伟大的东西一起工作,但当你进入生产时,你往往希望有一个更有力的保证。你想说的是,我不想相信互联网上每个随机的开发者都是绝对正确的。当他们说这不是一个破坏性的变化时。我想运行的正是现在在我的机器上工作的东西。而这就是收缩包的作用。如果你在rails中使用了bundle文件,shrink-wrap就会把所有的东西锁定在树上,一直到一个精确的版本。这样,你部署的东西就和你在开发环境中的东西完全一样。对共享模块进行收缩包装并不是一个好主意。如果你正在构建的是一个库,而且有很多人要分享,那么就让他们来做收缩包装。你应该对你的应用程序进行收缩包装,而不是对应用程序中的模块进行收缩包装。所以,我们现在处于第三阶段。到目前为止还不错,你已经创建了一个包,并且发布了它,现在它已经存在一段时间了。你还有其他几个相关的模块。你需要变得更高级一点。如果你一直在安装,安装的东西都是随意的,而且你不确定你是否记得输入------保存每一次你做的东西,那么你会注意模块文件夹会变得混乱,npm dee doop,一个npm修剪器为你和p.m.prune将摆脱任何没有在你的包中指定的包,Json和npm dee doop将非常积极地下去。看,如果它们是模块的副本,那可以折叠成一个模块的单一副本。如果你使用npm三,你绝对应该使用npm,三npm 3D dupe的东西就默认安装。默认的,但如果你已经从10 p.m.升级到10 p.m.3,它就不会搞乱你的与你的node模块文件夹。因此,你必须至少有一次明确告诉它,第一次是dee doop这个,之后npm three会保持它被duped。现在,运行更大项目的秘密是npm link。如果你有如果你完全采用了node写东西的方式,而且你要写,很多很多的小模块,你会遇到这样的问题,你会觉得我在写这个模块,我在写这个。一颗宝石在同一时间。这个模块取决于这个模块,我需要同时在这两个模块上工作。我不希望必须不断地推动Hub或发布新版本。只要能同时处理它们就可以了,这就是npm link的作用。你在一个文件夹中输入npm,链接,然后你在另一个文件夹中输入npm链接另一个包,突然间这两个版本都从实时拷贝中相互引用了。因此,你可以在一个文件夹中编辑实时版本,在另一个文件夹中编辑实时版本,并且它们都可以相互引用。Npm link对于进行复杂的npm安装是必不可少的。复杂的node应用。它对于我们编写npm本身的方式是绝对必要的,因为npm本身是几十个模块,它们相互依赖。接下来是npm update。如果你在npm的早期版本中使用npm update,那么Npm update曾经是个坏消息。我向你道歉,因为它所做的大多是破坏一切,因为它将试图递归地更新你的整个软件包树,达到无限的深度,这往往不是你所期望的,而且通常会产生一堆竞赛条件,这将意味着它将失败。它甚至不会做你不想要做的事情。我们只是不做任何事情,但从npm 3np开始就没有了。

更新只自动更新,你的顶级依赖,这通常是你想要发生的。如果你想在运行npm之前看看会发生什么,更新,这就是npm过时会告诉你的。它将告诉你什么包是。你已经安装了,如果你是一个npm更新,会安装什么包。而且它还会告诉你,如果有一个较新版本的软件包可用,而你的软件包Json不允许。因此,如果你正在运行版本5,而有一个版本6,你不知道npm update,不会拉入版本6,因为它是Ember,它知道这是一个突破性的变化,但你可能想知道这。有一个版本6,所以这就是npm outdated会让你知道的。所以,现在我们处于项目生命的第四阶段,你已经有了几个活跃的开发者。现在你雇佣了一些新人,他们不知道怎么做,也不知道你正在做的这个项目的历史。你开始需要更好的协调。你需要减少你的开发人员之间的沟通,你需要减少摩擦,我们都是这样做的。这个标签是一个真正伟大的方法,可以减少你必须对你的项目进行的沟通。默认情况下,有一个叫最新的光盘标签,如果你安装npm时不加任何Flags,它就会在最新的标签上安装软件包。但如果你有一个复杂的开发环境,你可能有几个发布渠道。你有稳定版,你有可能有LTS,你有测试版,你有下一个或其他什么,你可以在你的发布上给东西打上标签,然后人们可以在标签上安装,而不是分流号码。所以以前,如果你爱有一个Wiki页面,那会说,好吧,版本?1.1是测试版本。1.5是,你知道,下一个,你不需要再这么做了。只要告诉人们把标签安装到标签中就可以了,因为它和npm一样都是按照版本进行的。废弃的,如果你发现了一个bug,如果你发现了一个安全漏洞,你不希望人们再安装这个,但你也不想破坏他们的账单。而不是取消发布,它你可以直接deprecated它,它仍然会发布在。它仍然会像平常一样安装,但每次安装时都会打印一个警告去。嘿,这是废弃的中性。好吧,你不应该再使用它了。我谈到了npm运行脚本,开始停止和测试,这些都是基本的,但运行跳转实际上可以作为任何东西运行。你可以创建任何数量的运行脚本,你可以只用npm,运行,任意,字和一组要运行的脚本。当这种情况发生时,我们用这些来管理常规的、任务的、我们一直在做的东西,因为这是另一种减少沟通的方式,我们不必有一个Wiki页面,说,这是你如何设置我们的数据库。你不必有一个Wiki页面说,这些是去我们的数据库重置的配置选项,或者这是你如何启动缓存服务器的。你可以用它来控制本地服务。你可以用它来拆毁和设置东西。你可以用它来重置东西以达到测试目的,你也可以把它们结合起来。因此,如果你有一堆简单的步骤,你想让npm,运行Dev,这是我们一直在使用的,它重置数据库,它启动缓存服务器,它运行linter,它做,预编译,它做一切,所有这些步骤,结合成一个。再说一遍,我们不需要有一个Wiki页面。

我们只知道,当你npm运行Dev时,所有需要发生的事情都在发生。因此,运行脚本是非常强大的,我们认为人们应该比他们更多地使用它们。除了能够运行任意的运行脚本之外,还有大量的自动触发的运行脚本,它们是响应事件的生命周期挂钩。如果你在你的脚本节和p.m.中定义了这个,我们就会运行这些脚本。因此,你可以在发布前做一些事情,在发布过程中,在发布后安装卸载版本测试停止-启动重置,任何发生在你的项目上的事情,你都可以在脚本中挂钩,使它们自动发生,这非常有用。可以用它来实现最佳实践的自动化。如果你想确保没有人在没有运行linter的情况下提交任何东西,那么你可以把它放到预发布步骤中,如果你想确保没有人在没有重新编译CSS的情况下意外地启动服务器。那么你可以把它放到预启动脚本中。生命周期钩子是减少沟通量的一个很好的方法,你的团队要完成他们的工作,就必须要做这个。运行脚本的一个超级有用的特点是,它们在运行时,路径上有你的开发依赖。因此,像Grunt和Gulp这样的东西,还有一些linters,它们要求你把它们作为一个全局包来安装,它们要求你,你知道,它们不是你的包的一部分,就像安装这个工具,然后你会使用这个工具。但是,当一个新的Dev安装了东西之后,你突然有了一个Wiki页面,上面说好吧,首先你安装应用程序,然后你安装Grunt,然后你安装Gull,然后你安装这三个东西,然后你的测试会通过,但是你不必这样做,你可以把这些东西放在你的Of dependencies中,你的npm运行脚本会在运行时有这些工具的路径,而不必全局安装它们。首先。这意味着你可以省去安装额外的全局工具的步骤,而且你可以确保他们使用的工具是你所期望的版本。所以,他们不会在你使用grunt 3的时候意外地安装grunt,而你的东西不会坏。而且因为他们的Dev依赖性,当你在生产中安装他们时,他们不会被安装。所以,使用它们的生命周期钩子。这就是我们开始看到的npm任务的下一个发展阶段。现在,随着npm社区的人们开始越来越频繁地将越来越多的普通任务自动化。他们开始开发工具来帮助他们做到这一点。而这些工具都有相同的基本要求。它们需要被安装,需要被配置。它们需要定期地被触发。npm为他们处理了所有这些事情。而p.m.则成为这些工具游动的海洋,这些工具可以是小而集中的。他们不必有一个安装程序。他们不必有一个更新程序,而且他们的互操作性更好,因为他们都在npm的生态系统中运行。你不需要有一些疯狂的bash。脚本知道你应该按照什么顺序来运行你的预编译器和Babble以及SAS,因为它们都是由npm按照正确的顺序完成的。这是个意外,但它非常有用,如果它不是意外发生的,我们可能会这样设计。而这个生态系统中的一些工具,即使它们不是npm本身的一部分,那也成为人们用npm进行软件开发的基本方式,特别是前端软件开发,我想我要提到一堆。所以我已经提到了这两个,less和Sass正在成为你的前端开发的某种基线工具,你像CSS。那是昨天的事了,我想用所有的钟声和口哨声的CSS。这就是他们对你的要求,他们采取CSS并赋予它额外的功能。而事实上,使用少,和Sass安装npm,能够做预编译的课。SAS是很多npm用户在第一时间找到npm的原因。有像,我只是想做我的资产链,结果这个东西出现了,原来它是一个完整的应用平台,那就很不错了。但我实际上只是想让CSS少一些这些教训给我们,也有一堆整洁的插件,这意味着你可以只是npm安装额外的功能到其中,你也认为这是相当酷的。哦,现在外部冷却的鼻祖是Babble。巴布尔是一个转译器,可以把较新版本的JavaScript变成较旧版本的JavaScript。

因此,你可以开始在es6或es7或es2015或任何我们本周称之为的东西中编码,而不必考虑这些功能是否可用。它将把它们编译下来,使它们在节点中工作,它将把它们编译下来。所以它们在浏览器中工作。它将确保其工作,因为Seb是一个天才,我非常喜欢他。如果你在使用react,并且你在使用SX功能,babbled是你如何做到的。事实上,这有点奇怪,很多人,尤其是react社区的人,认为你在做转译,认为你已经安装了Babble,他们的教程。不再提大多数react的教程,除非你使用Babble,否则他们不会Deus。除非你使用Babble,否则就不能使用,他们就像,很明显,每个人都在使用Babble,但如果你不知道,现在,你知道,如果你要把代码拿到浏览器上,那么你会用几种方法来做,你可能会使用browserify或webpack。这些都是很常见的,也是人们所期待的。现在,很多教程只是假设你在使用webpack,而没有告诉你如何使用它或何时使用它的浏览器。如果我是第一个破解让节点代码在浏览器中工作的问题的人,而且它真的非常酷。它从插件中获得了很多功能,webpack在很多方面都是Browserify的第二版本,它采用了很多常见的用例,并将其直接构建在其中。因此,对于新手来说,它更容易上手。我认为。然后是标准,它是许多贷款人中的一个,尽管有这个名字,但它并不是一个标准。它只是被称为标准。他们所做的是自动执行代码标准,他们确保你的分号在那里或不在那里,你知道,你的大括号在正确的行上,不管它是你想要的。你可以定制这个,你的内部风格,并把它变成一个linter,你可以使用你的生命周期钩子来挂钩。确保你每次发布、运行或重新编译时,所有的东西都按照你想要的方式重新格式化,这很简单,也很吹毛求疵,但它意外地产生了更高质量的代码审查,因为如果你曾经在一个代码审查环境中,你会知道人们往往会去。哦,我只是需要说些什么。所以我要指出,你的分号在错误的地方。你知道,对我来说不好看,回去给你。那些是懒惰的代码审查,通过有一个林特的地方,这意味着你不能做懒惰的代码审查。你必须实际参与,因为代码风格将是完美的。它将会是绝对的。是完美的。所以你必须把逻辑搞清楚,你必须做一个真正进入逻辑的代码审查,这意味着你的团队节省了大量的时间,你得到了更高质量的代码。所以还有其他很酷的CSS东西,你可以用npm来做,而不仅仅是预编译。Seth Vincent的这个演讲是我在这方面的首选,它真的很酷。你可以做的是你可以使用,你可以使用npm将模块化的CSS打包成捆,然后你可以。用npm安装,你可以把你的CSS拆开,使用预处理器,比如parcel of Phi和sheet of Phi。把它变成你的CSS模块库,变成一个CSS表单。如果你在一个机构模式下工作,这特别好,你有很多房子的样式,或者你有像一套房子的模块,你想使用,你不想必须安装,400吨的CSS。每次你做一个小小的网站,你只需安装你当时使用的模块。所以npm版本会自动为你设置major minor或patch。但是这样做的问题是,你仍然必须决定,你仍然必须决定你是否在写,你知道,你已经写了一个错误修复,或者你已经写了一个新的功能,或者你已经写了一个突破性的变化,但是有一个很酷的模块,叫做semantic release,它会为你做这个。它的作用是,当你运行semantic release时,它会检查出你的代码的上一个版本。它运行它,对不起,它检查出你的测试的先前版本。它针对旧的测试来运行新的代码。如果旧的测试失败了,它就会说有重大变化,而且它还会为你挑选新的版本号,根本不需要你去考虑这个问题。

显然,有一堆情况下你的测试会失败,这些情况并不是真正的破坏性变化,但它永远不会得到它。所以,它会给你假阳性结果,但它永远不会给你假阴性结果。如果你是,正如我们希望的那样,你对你的版本号并不珍惜。如果你认为,你知道,整数是免费的,我们应该使用尽可能多的整数,因为你有。那么语义发布就是一种非常好的方式,可以确保你的代码发布始终是安全的,可以供大家取用。因此,到目前为止,我一直在谈论你可以用CLI的东西来做的事情,那是在你的机器上的局部。但在开始的时候,我说npm不仅仅是这样。它是一个注册表。它是一个社区,各种工具正在出现,它们利用中央注册表来做一些事情。如果每个人都是分布式的,他们的代码就会使用npm到CLI,你就不可能使用这些东西。

最大的下游工具之一是我们写的一个,也就是npm现场。我刚才提到它了它。在你的防火墙内运行,所以不管你有多偏执,你都可以拥有私人软件包。还有,它所做的是,它钩住了公共注册表,所以它充当了一个缓存,它充当了一个镜像,它充当了一个过滤器。所以你可以说只有符合我们许可的软件包。标准是只有我们的安全人员已经批准的软件包,或者只有在这个白名单上的版本的软件包。我们已经说过,我们的安全会在我们的企业环境中出现,npm现场可以相互连锁。所以你可以做一些非常酷的事情,比如说,好的。这是公共注册表。这是开发中使用的注册表,这是我们使用的真正被锁定的生产注册表,你的生产机器可以从现场的一个副本中运行。这绝对是安全的,同时你的开发人员不会陷入不得不使用旧版本或不存在的模块的困境。它还可以做一些事情,比如你知道它与你的单点登录相整合,它有一堆你需要的合规功能的东西。如果你需要在企业内部运行软件,这就是npm on site的作用,它是我们检查这些功能的盒子,这样你就可以在你的公司内部使用你想要的工具。下一个服务是Greenkeeper,Greenkeeper就像npm过时的云启用版本。而不是仅仅告诉你,当你运行npm outdated时,发生了什么?Greenkeeper会告诉你,当你的依赖关系或任何他们的依赖关系或任何他们的依赖关系发生变化时,它将自动运行你的测试。如果这个变化没有破坏,它将向你发送一个拉动请求。这包括新的版本,所以它将自动为你保持所有的更新,而不需要你做任何事情。除了说你想让它发生之外。这真的很强大。自动化可以使你的软件更安全,使你的软件运行得更快,而不需要做任何事情,只需要说是的,这是我想要的东西。另一个下游项目是节点安全项目。它是我们提供的注册表数据的另一个用户,它所做的是笔记安全项目,他们扫描每一个新发布的现有软件包的每个更新,以寻找新的和已知的漏洞。

如果你npm安装了NSP,你可以使用该工具来检查你的代码是否有任何。脆弱的,对任何已知的安全漏洞。你也许应该使用生命周期钩子。你也许应该直接运行NSP。每次你要发布一个新的版本时,因为没有理由要发布一个版本。这是不安全的。NSP也在努力与npm进行现场整合,以便这些东西可以自动发生。另外两个服务是sneak和bit Hound,它们是一些商业服务的潜行者,就像NSP一样。除了它不只是找到漏洞试图修补漏洞,sneak的创始人在那边。Bit Hound是一个比较通用的。它是一个试图衡量你的代码质量的工具。它试图告诉你的团队,他们是否产生了一些不只是,你知道的,符合JavaScript linting标准的东西。但它是否是好的代码,是否是高效的代码,我最喜欢的一个是Tonic,它是一个在线的JavaScript游乐场。他们所做的是把所有的公共包拉到他们的数据库中。因此,在你的浏览器里面,你可以要求注册表中的任何一个公共模块,所以你可以写有任何其他ret的JavaScript代码,注册表上的任何模块。在行,你可以用你自己的包来做这个。你可以对你的模块进行在线演示,而不需要,你知道,把所有东西都浏览器化,这对调试和现场来说真的很有趣。样本。因此,所有这些的信息是,npm不仅仅是npm,安装,npm,正试图为你减少摩擦,在开发的每一个阶段,正试图为每一个规模的团队的包减少摩擦。而我们真正喜欢的是,不断增长的注册表和注册表社区正在不断改进npm为每个人所做的一切。我们喜欢我们的社区不断使npm变得更好的方式,npm的爱 在我签字之前,有一件完全不相关的事情,就是有一个叫lgbtq ducks和lgbtq Dot technology的slack。如果你是科技界的LGBT人士,你想加入它。我发起了这个松弛。那里有几千个人,是一个互相交流的好地方。就这样。谢谢你。