前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日两题 T21

每日两题 T21

作者头像
合一大师
发布2020-07-20 09:41:21
4190
发布2020-07-20 09:41:21
举报
文章被收录于专栏:JavaScript全栈

算法

LeetCode T151. 翻转字符串里的单词[1]

描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例1

代码语言:javascript
复制
输入: "the sky is blue"
输出: "blue is sky the"

示例2

代码语言:javascript
复制
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例3

代码语言:javascript
复制
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

代码

代码语言:javascript
复制
/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
  return s.split(' ').filter(item => item).reverse().join(' ')
};

前端

介绍下 npm 模块安装机制

npm 模块安装机制:

•敲击npm install命令•查询node_modules目录之中是否已经存在指定模块

•若存在,不再重新安装•若不存在

•npm 向 registry 查询模块压缩包的网址•下载压缩包,存放在根目录下的.npm目录里•解压压缩包到当前项目的node_modules目录

执行 preinstall

preinstall 钩子此时会执行。

确定依赖模块

确定工程中的首层依赖——dependencies 和 devDependencies中指定的模块

以工程本身为依赖树根节点,此时会多进程深入遍历节点

获取模块

•获取模块信息。确定版本,因为 package.json 中往往是 semantic version(semver,语义化版本)。此时如果版本描述文件(npm-shrinkwrap.json 或 package-lock.json)中有该模块信息,则已之为准,如果没有则从仓库获取。如 packaeg.json 中某个包的版本是 ^1.1.0,则会获取符合 1.x.x 形式的最新版•获取模块实体。上一步获取了压缩包地址(resolved 字段),npm 会以此地址检查本地缓存,若有就直接拷贝,没有则从仓库下载•查找模块依赖,若有依赖则返回第1步,若没有则停止。

模块扁平(dedupe)

上一步获取到的依赖树,需要清除重复模块。比如 A 模块依赖于 moment,B 模块也依赖 moment。在 npm3 以前会严格按照依赖树的结构进行安装,会造成模块冗余。

npm3 开始默认加入了一个 dedupe 的过程。它会遍历所有节点,逐个将模块放在根节点下面,也就是 node-modules 的第一层。当发现有重复模块时,则将其丢弃。

这里需要对重复模块进行一个定义,它指的是模块名相同semver 兼容。每个 semver 都对应一段版本允许范围,如果两个模块的版本允许范围存在交集,那么就可以得到一个兼容版本,而不必版本号完全一致,这可以使更多冗余模块在 dedupe 过程中被去掉。

举个例子,假设一个依赖树原本是这样:

代码语言:javascript
复制
node_modules
-- foo
---- lodash@version1

假设 version1 和 version2 是兼容版本,则经过 dedupe 会成为下面的形式:

代码语言:javascript
复制
node_modules
-- foo

-- bar

-- lodash(保留的版本为兼容版本)

假设 version1 和 version2 为非兼容版本,则后面的版本保留在依赖树中:

代码语言:javascript
复制
node_modules
-- foo
-- lodash@version1

-- bar
---- lodash@version2

安装模块

更新工程中的 node_modules,并执行模块中的生命周期函数(preinstallinstallpostinstall )。

执行工程自身生命周期

当前 npm 工程如果定义了钩子此时会被执行(按照 installpostinstallprepublishprepare 的顺序)。

生成或更新版本描述文件,npm install 过程完成。

References

[1] 151. 翻转字符串里的单词: https://leetcode-cn.com/problems/reverse-words-in-a-string/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 算法
    • LeetCode T151. 翻转字符串里的单词[1]
      • 描述
        • 代码
        • 前端
          • 介绍下 npm 模块安装机制
            • npm 模块安装机制:
              • References
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档