我在我谈论的一个领域“使用SharePoint框架进行开发时避免陷阱”谈话是依赖关系,是您可能遇到的问题。是否依赖jQuery,Angular,React或其他JS库取决于您,但是总会有一些– and npm 通常是将这些库引入SPFx解决方案的方法。使用基于TypeScript / JavaScript的代码堆栈和npm包与.NET完全不同,我认为大多数SharePoint开发人员对于这个世界来说都是相当陌生的。那里’使用npm本身需要学习很多东西,但这对于使用SPFx成功进行团队开发非常重要。当然,如果您对npm,gulp和node.js感兴趣,’我已经做了很多现代的,以JS为中心的Web开发(我不这样做)’并不是jQuery!),但是除了编码方面,这里还有更深层次的话题。
To get the 开发者elopment and ALM process right with SPFx, some of the answers lie in use of commands like npm收缩包装,对package.json文件以及开发人员如何指定不同类型的依赖关系有深入的了解。但是在详细介绍之前,让’首先从讨论问题和了解一些一般背景开始。
我使用下面的幻灯片总结了该领域的一些关键陷阱,将它们分为“dev” and “shipping” considerations:
What are caret 依存关系 (never mind why they can be a pitfall)? What does –save 做的 npm安装 命令?如果这些是你的问题’现在问,然后是我的同伴帖子 SPFx-node_modules,package.json和其他节点概念的概述 可能会有用。
否则,让’s get to the detail.
没有在npm install上指定--save
对于不太熟悉npm的团队/开发人员来说,这是一个新手陷阱。当开发人员通过npm install添加软件包时,该软件包将从npm存储库下载并安装到您的应用程序中–至少在运行该命令的计算机和文件夹中。添加--save标志可确保该依赖项也记录在package.json中–此后,当任何开发人员为此应用程序运行npm install或npm update时,npm将再次确保适当的程序包已在本地下载并安装(因为package.json文件是通过源代码控制共享的)。它’与仅添加本地文件引用相比,相当于通过NuGet添加.NET依赖项。与以往一样,将整套软件包本身检查到源代码控制中通常不是一个好主意。 因此,陷阱很简单-如果开发人员在安装软件包时忘记使用--save标志,则package.json中不会出现任何条目,并且由于其他计算机上缺少库可能会导致代码失败。 您’会看到TypeScript编译错误,例如“Cannot find module”当另一个开发人员尝试构建或运行代码时(例如 喝一口):
建议–始终通过指定--save参数(或以下选项之一,例如–保存精确)在运行npm install时。
您还可以在这里为您的团队考虑一个自定义.npmrc文件,该文件可以自动指定某些参数(例如--save或--save-exact),而无需开发人员记住它们。我谈论 自定义.npmrc文件如何工作 在另一篇文章中。
N.B.如果确实陷入了使用依赖项的陷阱,而没有将其正确存储在package.json中,则只需使用--save(或类似)标志再次安装它。然后让每个开发人员运行一个npm更新,以确保每个人都使用相同的版本。
陷阱- using caret 依存关系 without thinking about it
添加npm软件包时,默认设置是使用脱字符号依赖项。但是,插入号和代字号依赖项都给开发过程带来了风险(但也可能有好处)。如果你’不熟悉使用尖号或波浪号的版本号,请阅读 我的背景文章 要么 NPM文档中的语义版本控制(Semver).
简短地说,脱字符号(^)表示可接受(但不包括)4.0.0以下的任何版本。像这样的插入符依赖性 是npm的默认设置,但可能会导致危险,因为在该版本范围内可能会进行各种更改,可能包括破坏性更改,具体取决于软件包作者的处理方式。并非每个人都遵循semver规则。因此,这意味着在团队开发中,团队中的一个人可以使用3.1.1和另一个3.9.9(即,发布相同主要版本,但使用不同次要版本的版本),具体取决于每个上个版本的运行时间 npm更新 command. So, there can be lots of variability from caret 依存关系 like these.
波浪号依存关系(〜)相似,除了此处的范围更窄–因此〜3.1.1允许的任何版本不超过(但不包括)3.2.0(即,发布的主要/次要版本相同,但补丁版本不同)。
还要注意我’m在这里略微简化了事情,因为当版本号中使用零时,npm处理事情的方式有所不同。见 塞姆弗 页面以获取更多详细信息。
So are caret and tilde 依存关系 always bad?
好吧,不是。您可能会决定在开发过程中确实要使用最新和最好的库,而不必麻烦地单独管理每个库。通常,您确实确实确实希望这些小错误修复和性能增强。– and avoiding “exact”依赖关系给你(只要你 npm更新 经常)。
建议–做出是否要的明确决定“floating” 依存关系 in 开发者.
如果否,请考虑以下选项:
- Ensure all 开发者elopers always use the –保存精确标志而不是–save flag
- This will have the effect of writing in an 精确 reference into package.json, rather than a caret 要么 tilde dependency
- 在团队中使用自定义的.npmrc文件具有相同的效果(开发人员无需记住–每次安装软件包时都保存精确)
- 再次,看到我的 SPFx-node_modules,package.json和其他节点概念的概述 有关此技术的详细信息
如果是,则:
- 坚持插入符号依赖性,但考虑成为“tighter”在您发布Web部件时–确保所有开发人员正在运行 npm更新 regularly, and perhaps switch to 精确 依存关系 just before 运输.
Whether you use 精确 依存关系 in 开发者 要么 not, there’我建议您总是在每次发行时冻结相关性,’s to run npm收缩包装。我们’接下来再说。
陷阱– not locking down 依存关系 when you make a release
In SPFx and node.js 开发者elopment, it’重要的是要记住node_modules文件夹是一个完整的文件夹 树 of 依存关系. First level 依存关系 that you know about have their 拥有 依存关系, which are stored in 儿童 node_modules文件夹– that’s为什么node_modules文件夹可以很大并且很深。我们的步骤’到目前为止,您已经讨论过,例如考虑使用--save-exact以避免插入符/波浪号依赖性,只会使您到目前为止– and that’,因为它们仅处理您的第一级依赖项。因此,你’会发现很难重新创建作为v1发行的* 精确 *版本,因为您可以’t还原您在构建时拥有的确切的node_modules文件夹。相信你 可以 如果您始终将每个版本的整个mode_modules文件夹都检查到源代码管理中,那真是糟糕!
您需要的是整个 树 of 依存关系 to be frozen for each release – npm收缩包装命令给你这个。它创建一个JSON文件,其中包含所使用的每个软件包的哪个版本的详细信息:
此后,如果对包含此类文件的文件夹使用了npm install或npm update命令(命名为 npm-shrinkwrap.json),npm将使用它来还原软件包。这与默认行为不同,默认行为将使用package.json文件中指定的任何插入符号或代字号依赖项(等)。因此,使用这种方法,您可以还原整个构建在某个时间的状态,而无需使node_modules文件夹当时处于其状态。
建议–每次发布代码版本时,请运行npmrinkwrap。将npm-shrinkwrap.json存储在源代码管理中。
概要
Creating SharePoint Framework solutions effectively involves more than just learning the 新 APIs. 您 need to build a good understanding of the underlying web stack, and arguably some elements are more important than others –我建议您将模块,软件包和npm组合在一起使用。没有这个,它’开发或交付SPFx解决方案时,很容易陷入一些陷阱。总体而言,我建议:
- Taking care when 开发者elopers add libraries –确保在package.json中对其进行跟踪
- 决定你是否’re happy with 漂浮的 依存关系 during 开发者, 要么 whether you prefer to use 精确 依存关系
- 每次发布解决方案的版本时,都要运行npmrinkwrap,并将npm-shrinkwrap.json文件检入源代码管理。这样就可以在以后从未发布依赖项版本的情况下,正确地重建应用程序