lerna
文章平均质量分 50
2024路在何方
某行业全球top1企业的前端主管
展开
-
14.兼容windows和macOS的spawn
14.兼容windows和macOS的spawnspawn在windows和macOS是有兼容问题的,那么我们就需要写一套具备兼容能力的spawn举例说明:在macOS中,执行spawn代码cp.spawn('node', ['-e', 'console.log(1)'], ...)在win32中,执行spawn代码就为c.spawn('cmd', ['/c', '-e', 'console.log(1)'], ...)function spawn(command, args, op原创 2021-06-24 21:10:05 · 1441 阅读 · 0 评论 -
13.举例说明将代码改成多进程执行
8.举例说明将代码改成多进程执行假设原先的代码如下:require(rootFile).call(null, Array.from(arguments)); // require加载并执行,这个后续会改成node多进程去实现那么如何将这个require改为多进程执行呢?思路:这是一段node代码,执行这段代码,类似于执行console.log(1)。而console.log(1)可以用node -e "console.log(1)"拉来执行。同理,将上面的require改成这种方式执原创 2021-06-24 20:38:37 · 264 阅读 · 0 评论 -
12.抽象Command
12.抽象Command我们在开发脚手架的时候,对于命令一般会封装成一个Command库,然后所有执行的命令都继承这个库1. Command库我们会建造一个Command类,这个类会接收到命令行的所有参数然后解析参数,对不符合要求的参数进行错误处理核心:通过promise链式调用,异步逐步执行node版本检查,参数初始化,程序初始化,程序执行等操作参数初始化主要是为了获取参数的最后一位——命令对象和除了最后一位的参数程序初始化init和程序执行exec函数,在Command类都会报出一个原创 2021-06-23 23:55:46 · 271 阅读 · 0 评论 -
11. node多进程之同步方法——execSync、execFileSync、spawnSync
11. node多进程之同步方法——execSync、execFileSync、spawnSyncexecSync、execFileSync同步方法直接返回内容,内容是Buffer类型spawnSync返回的是一个对象,里面有stdout,output等等,这几个属性内容是buffer类型,还有status,pid等等同步方法的错误用try…catch(err){…}来捕获const cp = require('child_process')// 同步方法直接返回内容,内容是Buffer类型原创 2021-06-23 00:32:52 · 8001 阅读 · 0 评论 -
10.node多进程之exec/execFile/spawn/fork之间的区别
10.node多进程之exec/execFile/spawn/fork之间的区别1.如何取选择使用exec/execFile和spawn?spawn是流式的,所以适合耗时任务,比如执行npm install,打印install的过程exec/execFile比较适合开销小的任务,更关注结果,比如ls等2. fork一般用于哪些场景?一般用于比较耗时的场景,并且用node去实现的,比如下载文件fork可以实现多线程下载:将文件分成多块,然后每个进程下载一部分,最后拼起来3. requir原创 2021-06-23 00:30:10 · 1143 阅读 · 0 评论 -
9.node多进程之fork
9.node多进程之fork1. fork使用fork使用node来执行命令参数:模块的路径,相当于用node来执行该模块fork底层也是spawn,fork会返回一个子进程对象,通过这个子进程对象,可以实现主进程和子进程之间的通信const cp = require('child_process');const path = require('path');// fork使用node来执行命令// 参数:模块的路径,相当于用node来执行该模块cp.fork(path.resolv原创 2021-06-23 00:26:27 · 1193 阅读 · 0 评论 -
8.node多进程之spawn
8.node多进程之spawn1.spawn用法spawn返回的是子进程,不具备回调功能,但是子进程可以处理结果spawn是逐步输出结果的,如果某行出错了,那么该行错误被监听到,然后会继续往下执行,不会中断const cp = require('child_process');const path = require('path');// spawn返回的是子进程,不具备回调功能,但是子进程可以处理结果// spawn是逐步输出结果的,如果某行出错了,那么该行错误被监听到,然后会继续往下原创 2021-06-23 00:18:14 · 2236 阅读 · 0 评论 -
7.node多进程之exec与execFile
7.node多进程之exec与execFile1. 以下是exec的使用可以执行一个命令,也可以执行一个文件,但是不能单独传参// exec执行一个命令(可以是自己脚手架的命令),但是不能执行一个文件// exec(命令字符串,options,回调函数)cp.exec('ls -al|grep core.js', { cwd: path.resolve(__dirname, '../') // 在指定目录下执行}, (err, stdout, stderr) => {原创 2021-06-23 00:16:08 · 1220 阅读 · 0 评论 -
6.当前实现的脚手架架构及存在的问题
3.当前实现的脚手架架构及存在的问题痛点分析当前脚手架架构图如下:------------------------------------------------------------------------| 脚手架 || ------------- ------------- ------------- ------------- |原创 2021-06-15 15:22:08 · 226 阅读 · 0 评论 -
5.commander在脚手架项目中的应用
5. commander在脚手架项目中的应用1. 初始化const commander = require('commander');const program = new commander.Command();const pkg = require('./package.json');registerCommand();function registerCommand(){ program .name(Object.Keys(pkg.bin)[0]) .usa原创 2021-06-15 14:37:55 · 297 阅读 · 0 评论 -
4.Node项目如何支持ES Module,即:CommonJs中如何支持ES Module
4.Node项目如何支持ES Module,即:CommonJs中如何支持ES Module1. 模块化的发展历程(由先到后):CMD/AMD/require.jsCommonJS用require()加载模块,用module.exports/exports.x来输出模块ES Module用import加载模块,用export default/export来输出2. CommonJS中使用ES Module防范方案一:利用webpack打包编译成commonJs假设当原创 2021-06-15 01:28:53 · 1161 阅读 · 0 评论 -
3.commander库的使用
3.commander库的使用1. 获取program实例的两种方式从commander中解构出一个program单例const commander = require('commander');const { program } = commander;手动实例化一个commander实例为programconst commander = require('commander');const program = new commander.Command();2. 参数解析原创 2021-06-15 01:26:36 · 616 阅读 · 0 评论 -
2.搭建项目通用步骤
2.搭建项目通用步骤在入口的bin文件中协商#!/usr/bin/env node安装import-local进行判断是否使用本地的当前包#!/usr/bin/env nodeconst importLocal = require("import-local");const log = require("@imooc-cli-dev/logs");if (importLocal(__filename)) { log.notice("cli", "当前使用本地 imooc-cli-原创 2021-06-15 01:24:58 · 195 阅读 · 0 评论 -
8.path-exists库的源码解析
8.path-exists库的源码解析判断文件是否存在分同步和异步使用const pathExists = require("path-exists")pathExists(绝对路径或相对路径).then(res => { // res返回true则表示存在,false则表示不存在})pathExists.sync(绝对路径或相对路径)源码'use strict';const fs = require('fs');module.exports = fp =原创 2021-06-01 19:14:01 · 482 阅读 · 0 评论 -
7.locate-path库的源码解析
6.locate-path库的源码解析当前库的作用就是判断某个文件名称(带后缀)数组中是否有一个文件是否在某个目录下,如果在,则返回这个文件名称(带后缀),如果不在则返回undefined同步方法的使用const locatePath = require("locate-path");const file = locatePath.sync(filenames数组, {cwd: dir});同步方法的源码'use strict';const path = require('pat原创 2021-06-01 19:12:19 · 288 阅读 · 0 评论 -
6.find-up库的源码解析
6.find-up库的源码解析该库用于在某个目录下向上找指定文件找到返回该文件路径,找不到返回null同步的使用const findUp = require("find-up")const fp = findUp.sync('package.json', {cwd: "a/b/c/d"});同步的源码const path = require('path');const locatePath = require('locate-path');module.exports.s原创 2021-06-01 19:11:02 · 388 阅读 · 0 评论 -
5.pkg-dir源码解析
5.pkg-dir源码解析从某个目录开始向上查找,直到找到存在package.json的目录,并返回该目录。如果未找到则返回null使用const pkgDir = require('pkg-dir');const globalDir = pkgDir.sync(path.dirname(filename));源码'use strict';const path = require('path');const findUp = require('find-up');modul原创 2021-06-01 19:10:12 · 622 阅读 · 2 评论 -
4.import-local库的使用
import-local库的使用一、import-local的作用是什么?作用:当我们本地node_modules存在一个脚手架命令,同时全局node_modules中也存在这个脚手架命令的时候,优先选用**本地node_modules**中的版本二、为什么要优先用本地的脚手架?通常来讲,全局安装一个脚手架后,本地是不需要安装脚手架的。但是当我们本地安装脚手架的时候,意味着我们项目里用到了这个脚手架。当与全局冲突的时候,比如全局和本地都有这个脚手架,但是版本不同,那么我们应该使用本地的原创 2021-06-01 19:07:17 · 2431 阅读 · 1 评论 -
3.yargs框架使用(常用API)
yargs框架使用(常用API)常用API初始化使用const yargs = require('yargs/yargs');const { hideBin } = require('yargs/helpers'); // hideBin用于做输入命令的参数解析const arg = hideBin(process.argv); // 得到命令参数const cli = yargs(arg);cli .argv; //调用.argv,完成yargs初始化,这时候,输入hahayh --原创 2021-05-19 20:12:59 · 1742 阅读 · 0 评论 -
2.开源脚手架lerna源码分析
开源脚手架lerna源码分析学习目标Lerna源码结构和执行流程分析import-local源码深度精读学习收获如何将源码分析的收获写进简历学习明星项目的架构设计获得脚手架执行流程的一种思路脚手架调试本地源码的另外一种方法Nodejs加载node_modules模块的流程(罕见)各种文件操作算法和最佳实践学习建议:需要具备一定的Node基础源码学习1.准备源码源码阅读准备完成的标准(重点):找到入口文件能够本地调试调试按钮:原创 2021-05-19 16:46:43 · 645 阅读 · 7 评论 -
1.基于lerna搭建脚手架框架
基于lerna搭建脚手架框架learn项目步骤一、脚手架项目初始化主要包含: 初始化npm项目 安装lerna lerna init初始化项目创建文件夹yh-imooc-clic-dev,并npm init -y初始化安装lerna,这是一个开发依赖npm i -D lerna(可选)建议全局也装一个lernanpm i -g lernalerna初始化lerna initpackage.json变为:{ "packages": [原创 2021-05-17 20:50:47 · 1418 阅读 · 0 评论