4.import-local库的使用

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()源码分析

待完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值