import-local库的使用
一、import-local
的作用是什么?
- 作用:
- 当我们
本地node_modules
存在一个脚手架命令,同时全局node_modules
中也存在这个脚手架命令的时候,优先选用**本地node_modules
**中的版本
- 当我们
二、为什么要优先用本地的脚手架?
- 通常来讲,全局安装一个脚手架后,本地是不需要安装脚手架的。但是当我们本地安装脚手架的时候,意味着我们项目里用到了这个脚手架。当与全局冲突的时候,比如全局和本地都有这个脚手架,但是版本不同,那么我们应该使用本地的脚手架。这就是
import-local
的作用。
三、源码分析
-
源码
'use strict'; const path = require('path'); const resolveCwd = require('resolve-cwd'); const pkgDir = require('pkg-dir'); module.exports = filename => { // pkgDir.sync是为了获取 当前参数(地址) 包含package.json的模块目录,也就是会从path.dirname(filename)逐层向上找,直到找到package.json为止所得到的路径。即path.dirname(filename)所在包目录 // 这里filename是C:\Users\yuhua7\Desktop\视频\web架构师学习笔记\lerna源码学习\lerna\core\lerna\cli.js // 这里globalDir是C:\Users\yuhua7\Desktop\视频\web架构师学习笔记\lerna源码学习\lerna\core\lerna const globalDir = pkgDir.sync(path.dirname(filename)); // 找出globalDir与filename的相对路径,也就是以globalDir为参照到filename的路径 // 结果为cli.js const relativePath = path.relative(globalDir, filename); // 拿到filename所在包的package.json const pkg = require(path.join(globalDir, 'package.json')); // path.join(pkg.name, relativePath)把包名lerna和cli.js进行合并,合并结果为lerna/cli.js // 然后resolveCwd.silent('lerna/cli.js')来判断当前本地是否有这个文件,结果为C:\Users\yuhua7\Desktop\视频\web架构师学习笔记\lerna源码学习\lerna\core\lerna\cli.js // import-local包的核心代码就这么一句——resolveCwd.silent() const localFile = resolveCwd.silent(path.join(pkg.name, relativePath)); // 判断本地是否有这个文件,则require()该文件,require就是执行该文件 return localFile && path.relative(localFile, filename) !== '' ? require(localFile) : null; };
-
重点包
pkg-dir
获取包含
package.json
的文件夹目录,详见《5.pkg-dir库的源码解析》 -
核心代码
resolveCwd.silent()
分析
待完成
-
核心内置模块
module
的部分源码分析- 其中
module._resolveFilename()
为require
源码的核心代码,用于解析模块的真实路径 - 其中
module._nodeModulePaths()
用于生成node_modules可能的路径
- 其中
待完成
require()
源码分析
待完成