接下来我们将开始写逻辑代码,为了维护方便,我们将在 lib 文件夹下分模块编写,然后在 bin/index.js 引用。...打开 lib/config.js 文件,添加以下代码: // 请求 fs-extra 库 const fse = require('fs-extra') const path = require('path...库const fse = require('fs-extra') const path = require('path') // 请求 config.js 文件 const defConfig = require...库,用于文件操作const fse = require('fs-extra') const path = require('path') // 请求 config.js 文件 const defConfig...打开 lib/init.js 文件,添加以下代码: // 请求 fs-extra 库,用于文件操作 const fse = require('fs-extra') // 请求 ora 库,用于初始化项目时等待动画
unlink 断开),然后打开终端,输入以下命令并回车: js-plugin-cli -v 此时,应该返回版本号 1.0.0,如图: 接下来我们将开始写逻辑代码,为了维护方便,我们将在 lib 文件夹下分模块编写...打开 lib/config.js 文件,添加以下代码: // 请求 fs-extra 库 const fse = require('fs-extra') const path = require('path...库 const fse = require('fs-extra') const path = require('path') // 请求 config.js 文件 const defConfig...require('chalk') // 请求 fs-extra 库,用于文件操作 const fse = require('fs-extra') const path = require('path')...= require('fs-extra') // 请求 ora 库,用于初始化项目时等待动画 const ora = require('ora') // 请求 chalk 库 const chalk =
为了便于处理,索性写成了一个 JS 模块。之所以不直接用 JSON,是因为模块比 JSON 文件,更灵活性,后期扩展方便,如果有的话。 这一步是必须手动做的,或者说总是需要有一个人手动去做的。...为了避免未知错误,如果找不到或找到多个,就直接 crash....('fs-extra') const path = require('path') const intentInfo = require("....= require("path") let fs = require ('fs-plus') let fse = require('fs-extra') let os = require(...为了避免未知错误,如果找不到或找到多个,就直接 crash.
fs-extra[8]。一个暴露Node.js核心fs模块的库,以及一些额外的方法,使其更容易与文件系统一起工作。 现在我们知道了zx给了我们什么,让我们用它创建第一个shell脚本。...如果which找到了程序的路径,它将返回该程序。否则,如果该程序找不到,它将抛出一个错误。如果有任何程序找不到,我们就调用exitWithError辅助函数来显示一个错误信息并停止运行脚本。...Node.js支持两种模块类型: CommonJS Modules[12] (CJS)。使用module.exports来导出函数和对象,在另一个模块中使用require()加载它们。...使用export来导出函数和对象,在另一个模块中使用import加载它们。 Node.js生态系统正在逐步采用ES模块,这在客户端JavaScript中是很常见的。...本文中的所有代码都可以在GitHub[24]上找到。
使用debug的示例 基本用法: const debug = require('debug')('my-module'); debug('Starting the module'); // ...执行模块逻辑...fs-extra库作为Node.js内建的fs模块的扩展,提供了丰富的附加功能和实用工具,极大地简化了文件系统操作。...fs-extra的优势 扩展的功能:相较于核心fs模块,fs-extra提供了更广泛的文件和目录操作功能。 便利的函数:简化了复制、移动、删除和创建目录等常见任务。...健壮的错误处理:提供了强大的错误处理机制,确保优雅的错误恢复。 跨平台兼容性:在不同操作系统中保持一致的工作表现。...使用fs-extra的示例 递归复制目录: const fs = require('fs-extra'); fs.copy('./src', '.
手动加载样式。...首先,前置一个自动化收集组件目录的工作,生成components.json用来作为webpack入口,实现的build/component.js代码如下: const fs = require('fs-extra...-commonjs、webpack模块化原理-ES module、webpack模块化原理-Code Splitting),而通常作为按需加载来说,用户会有自己的webpack,那么组件库需要做的就是把...那么,基于上面webpack编译的文件,我会用vue-sfc-compiler编译出的更小的文件做覆盖,具体代码如下: const fs = require('fs-extra'); const compiler...在上一步,按需加载阶段,其实已经把每个组件编译好了,那么入口文件,其实只要用babel做个转换就可以了,这里用到gulp来操作,代码如下: const gulp = require('gulp'); const
true 改为了 false ,导致默认情况下不支持 node 模块,比如 require、path等常用模块。...webPreferences: { nodeIntegration: true, // 请将此项设置为 true }, }); 打包时遇到的问题 问题1:.node 模块的加载问题...所以,我们构建不同平台的代码时,也需要告诉程序:到不同的目录中去加载文件。...8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3 • loaded parent configuration preset=react-cra 其中 public/electron.js not found 指的就是无法找到入口文件...模块的语法错误 在执行打包时,出现以下错误: [项目目录]\node_modules\electron-builder\node_modules\fs-extra\lib\empty\index.js
,而实际上 Electron 安装失败,只生成了 node_modules/electron 目录,目录中的文件不完整,脚本中的 "path.txt" 也不存在,导致运行时抛出异常。...true 改为了 false ,导致默认情况下不支持 node 模块,比如 require、path等常用模块。...webPreferences: { nodeIntegration: true, // 请将此项设置为 true }, }); 打包时遇到的问题 问题1:.node 模块的加载问题...8F-from-react-to-an-electron-app-ready-for-production-a0468ecb1da3 • loaded parent configuration preset=react-cra 其中 public/electron.js not found 指的就是无法找到入口文件...模块的语法错误 在执行打包时,出现以下错误: [项目目录]\node_modules\electron-builder\node_modules\fs-extra\lib\empty\index.js
不过,需要注意的是fs-extra模块是添加了本机fs模块中不包含的文件系统方法,并向fs方法添加了promise支持。它还使用优美的fs来防止EMFILE错误。它应该是fs的替代品。...这里我们看到引入两个模块,分别是fs、chalk。Node.js内置的fs模块就是文件系统模块,负责读写文件。chalk模块是美化命令行输出样式,使输出命令不再单调。...child_process模块是nodejs的一个子进程模块,可以用来创建一个子进程,并执行一些任务。比如说就可以直接在js里面调用shell命令。 介绍完引入的模块,然后再介绍下面的代码。...如果错误,就删除远程项目工程目录。否则,就判断....第一部分为主版本号,变化了表示有了一个不兼容上个版本的大更改。第二部分为次版本号,变化了表示增加了新功能,并且可以向后兼容。第三部分为修订版本号,变化了表示有bug修复,并且可以向后兼容。
今天,现代Web应用程序中97%的代码来自npm模块。我们遴选了30个常用的nodejs安装包,让您免于重新发明轮子。...listen emitter.off('foo', onFoo) // unlisten 4.Underscore.js Underscore.js是一个用于 JavaScript 的实用程序带库,它在不扩展任何核心.../build', error => { if (error) console.error(error); }); 2.fs-extra FS-extra 添加了未包含在本机 fs 模块中的文件系统方法...const fs = require(‘fs-extra’); async function copyFiles () { try { await fs.copy('/tmp/myfile'.../server.js 7. dotenv Dotenv 是一个零依赖模块,可将 .env 文件中的环境变量加载到 process.env 中 .env file: DB_HOST=localhost
这样,我们就可以通过 require 来加载任何类型的模块或文件,比如 CoffeeScript、 JSX、 LESS 或图片。...合并相同的模块: new webpack.optimize.DedupePlugin() 说明:该插件会把相同的模块合并,不推荐使用,最好自己做到模块唯一性,如果打出来两个相同的模块,说明你的代码潜藏出错风险...解决方法:在加载器里面加上-convertValues参数。 问题三,css require的优先级问题,按照常理是后require的css是后加载。...但是在实践过程中,(1)通过import引入的js模块中引入的css是优先于require引入的js模块中引入的css;(2)js中require的css名称如果和js所在模块的文件夹名字相同即使部分相同的话...('gulp'), argv = require('yargs').argv, fs = require('fs'), fse = require('fs-extra'),
fs 和 fs-extra 这2个库主要用于nodejs环境下对文件的操作,fs-extra是fs的拓展,让更少代码可以实现同样的操作。...loadingDemo = async (message: T): Promise => { const spinner = ora(message); spinner.start(); // 开启加载...一般配套系列的鉴权流程,假如是一个public的仓库其实没必要做那么多额外的安全操作;其次项目也是想尽量减少三方制约的规则,方便以后作为一个纯净版项目移植到其他地方,可以到shelljs满足不了的情景再考虑加入api模块...projectName); } catch (err) { console.log(red('❌ Error: ' + err)); } }; 复制代码 在create方法中,所有步骤的错误都会被...creator.ts)调用,本地开发是没问题的: import { loading } from '@root/src/utils/global'; 复制代码 但是在tsc编译后再运行就会出错,原因是无法识别
fs 和 fs-extra 这2个库主要用于nodejs环境下对文件的操作,fs-extra是fs的拓展,让更少代码可以实现同样的操作。...loadingDemo = async (message: T): Promise => { const spinner = ora(message); spinner.start(); // 开启加载...一般配套系列的鉴权流程,假如是一个public的仓库其实没必要做那么多额外的安全操作;其次项目也是想尽量减少三方制约的规则,方便以后作为一个纯净版项目移植到其他地方,可以到shelljs满足不了的情景再考虑加入api模块...mainLine(projectName); } catch (err) { console.log(red('❌ Error: ' + err)); } }; 在create方法中,所有步骤的错误都会被.../lib/creator.ts)调用,本地开发是没问题的: import { loading } from '@root/src/utils/global'; 但是在tsc编译后再运行就会出错,原因是无法识别
chalk # 为`create-react-app`安装`commander` $ lerna add commander --scope=create-react-app # 如果安装失败,请检查拼写是否错误或者查看子包是否有命名空间...文件写入部分配置 const fse = require('fs-extra') const init = async () => { // ......('chalk') const fs = require('fs-extra') const webpack = require('webpack') const configFactory = require...,可自行选择构建工具,依赖管理,单元测试等配套设施 各模块仓库体积一般不会太大 使用多个仓库管理的缺点 仓库分散不好找,当很多时,更加困难,分支管理混乱 版本更新繁琐,如果公共模块版本变化,需要对所有模块进行依赖的更新...CHANGELOG梳理异常折腾,无法很好的自动关联各个模块的变动联系,基本靠口口相传 使用monorepo管理的缺点 统一构建工具,对构建工具提出了更高要求,要能构建各种相关模块 仓库体积会变大 使用
文件操作依赖npm install tapable fs-extra -D接下来我们在 src 目录下新建两个入口文件和一个公共模块文件:mkdir src && cd src && touch entry1...entry 配置的方式多样化,如:可以不传(有默认值)、可以传入 string,也可以传入对象指定多个入口。所以读取入口文件需要考虑并兼容这几种灵活配置方式。...runLoaders(modulePath) { const matchLoaders = []; // 1、找到与模块相匹配的 loader const rules = this.options.module.rules...虽然不添加进入模块编译 但是仍要在这个模块上记录被依赖的入口模块 this.modules.forEach((module) => { if (module.id...// plugins/custom-webpack-pluginsconst fs = require('fs-extra');const path = require('path');class CustomWebpackPlugin
---- 脚手架命令动态加载功能架构设计图 是否执行本地代码 设置全局的 targetPath // 设置全局的 targetPath program.on('option:targetPath',...const fse = require('fs-extra'); const pathExists = require('path-exists').sync; const pkgDir = require...('pkg-dir').sync; const path = require('path'); // Package 类 管理模块 class Package { /** * @description.../** * @description:获取入口文件的路径 * 1.获取package.json所在的目录 pkg-dir * 2.读取package.json * 3.找到...semver.gte(currentVersion, lowestVersion)) { throw new Error(colors.red('错误:node版本过低')); }
很快,同事们就发现这种方式的几个问题 手动修改配置容易出现漏改 每次克隆项目太过麻烦 模版项目的优化无法同步 解决方案 虎妞计划,建立一个简单的脚手架,打包成一个npm包,发布到公司私有库中,其他同事只要在全局安装了这个包...dotenv: 用于加载环境变量,从而避免将配置敏感信息硬编码到代码中。 download-git-repo: 用于从 Git 仓库下载文件或整个仓库,支持多种协议(如 HTTP、SSH)和分支。...fs-extra: 扩展了 Node.js 原生的文件系统模块(fs),提供了更多的方法,如复制、移动、删除等,方便文件的操作。..."chalk": "4.0.0", "commander": "10.0.0", "dotenv": "^16.1.4", "download-git-repo": "3.0.2", "fs-extra...现有的项目模版是一次性的,如果拉下来,就无法继续更新了,如果能够把整个项目模版打成一个安装包在项目中安装,这样我们唯一统一的项目模版,有新功能的更新,只需要改一次,其他平台更新依赖就可以了。
var program = require('commander'); program .version('0.1.0') .option('-f, --foo', 'enable some...图片 signale signale 可以用来打印信息到屏幕 fs-extra 和 klaw fs-extra 是对 fs 的包装,它提供了 promise 支持,还有一些有用的功能。...klaw 原本属于 fs-extra 的一个功能,但是现在它被抽离出来,它可以用来遍历目录。...ans.dir) return; 如果是文件夹的话,我们使用 klaw 遍历目录,找到所有 srt 文件。...npm deprecate [@] npm 不建议删除包,因为包可能被别人引用。
领取专属 10元无门槛券
手把手带您无忧上云