走进 San CLI(上):使用介绍

2023-11-03

本文是 San CLI 的使用和原理的第一篇,主要介绍 San CLI 的初衷和使用,下一篇介绍具体的实现原理。

什么是 CLI

CLI,是命令行界面(command-line interface )的英文缩写,命令行界面是在图形用户界面得到普及之前使用最为广泛的用户界面。

我们就不看图形用户界面和命令行界面的定义了,直接举两个例子直观些。

这是图形用户界面:

图片

这是命令行界面:

图片

虽然命令行界面没有图形用户界面使用广泛,但后者并不能取代前者,原因这里列举一些:

  • 远程操作。如果我们要远程操作一台服务器,而且不用命令行界面,那么,我们就得先来个远程桌面连接,这显然比较麻烦,或者,我们可以跑到那台服务器面前给它装个显示器,当然,服务器不能离我们太远。

  • 自动化。如果要用图形化界面执行一些自动化流程,那就得用按键精灵来录制操作。

  • 计算资源。图形化界面需要的计算资源远比命令行界面需要的计算资源多。

所以,有时我们还是需要 CLI 的。

我们了解了 CLI 后,那 San CLI 又是什么?

顾名思义,San CLI 是 San 的 CLI。简单来说,它是一个内置 Webpack 的命令行工具,当我们在开发 San 项目时,它能帮助我们省时省力。具体它是怎么帮助我们省时省力的,文章后边会讲到。

为什么要做 CLI

「生产工具提升生产力」

CLI 是前端开发的生产工具,提升 CLI 的体验可以直接提升我们的生产力,这是我们的第一需求。

图片

San CLI 从项目的创建、开发、调试、上线研发全流程入手,分别提供对应的解决方案,提升研发体验和开发效率。

图片

除此之外,CLI 作为开发过程中接触最多的工具,我们的目标是以它为基础,做一套前端工程化集成解决方案,将项目和团队的最佳实践融入到 CLI 中,同时统一并且标准化项目,以便只需要升级 CLI 就可以实现解决方案在项目之间的迁移。

举例说明:假如我们团队通过实践证明某一个方案可行,那么我们可以封装到 CLI 的某个命令中,或者发布对应的插件,通过改变打包参数来让项目支持这种解决方案,比如 PWA、modern mode 等。

「I have a dream!」

而我们更宏大的目标是:

图片

把 San CLI 做成一套可定制的前端工程化集成解决方案,让大家可以忘了 Webpack,直接通过执行 San CLI 提供的命令行命令来开发。

「Yes,We Can!」

San CLI 有什么功能

接下来,我们将从开发一个新项目的全流程,即项目的创建、本地开发、调试、打包上线这 4 个环节,来介绍 San CLI 的功能。

创建:通过脚手架标准化项目

首先是项目的创建。我们在命令行里执行 san init xxx,就会创建一个名为 xxx 的文件夹,然后在里边初始化一个 san 项目。

为了方便我们之后开发,在初始化的过程中,命令行会询问我们一些问题,我们对这些问题的回答将决定最终初始化出来的项目是什么样子的。

我们来看看初始化的实际过程。

图片

可以看到,有一个警告,这个警告是因为我们在执行初始化项目命令时没有指定脚手架模板,于是 San CLI 使用默认的脚手架模板来初始化。默认的脚手架模板就可以满足大多数情况,所以无视这个警告就行。如果我们遇到了需要另外指定脚手架模板的情况,比如我们想用我们自定义的脚手架模板,可以移步 San CLI 官方文档查看该怎么做,这里我们只介绍最常用的部分。

现在我们来看下命令行问我们的这些问题分别都是什么意思。

  • 项目名称:这个名称会用于 package.json 里的 name 字段的值,以及 README.md,默认使用项目所在文件夹的名称作为项目名称,在这里也就是 xxx。

  • 项目描述:用于 package.json 里的 description 字段的值。

  • 作者:用于 package.json 里的 author 字段的值,以及初始化时生成的文件的头部注释。

  • 选择模板引擎:有 2 个可选项,一个是图中的 “Smarty”,另一个是 “纯 HTML”,也就是不用模板引擎。如果我们不了解模板引擎或者不知道该选什么,那就选 “纯 HTML”。

  • 是否安装 ESLint:ESlint 的作用是检查编码规范。

  • 选择 ESLint 配置:如果我们上一步同意了安装 ESLint,才会有这一步。这一步有 3 个可选项, @ecomfe/eslint-config、 Standard、 Airbnb,选我们喜欢的就行,百度内部一般是用 @ecomfe/eslint-config。

  • 是否安装 ESLint 的 lint-staged:如果我们之前选择了安装 ESLint,才会有这一步。如果安装,那么,之后我们在开发中执行 git commit 的时候,会对改动的文件进行编码规范检查,检查不通过就无法完成 git commit。出于对高质量的代码的追求,建议安装。有的人可能会担心有的情况确实不需要检查代码规范怎么办,比如把远古时期的代码从一个库迁移到另一个库,很简单,只需要给 git commit 命令加上 --no-verify 就可以跳过检查了。

  • 安装 demo 示例:如果我们对用 san 开发不熟悉,建议安装,这样我们开发时就可以参照 demo 了。

  • 选择示例代码类型:如果我们上一步同意了安装 demo 示例,才会有这一步。这一步有 2 个可选项,“san-store” 和 “normal”。如果我们不知道自己是否需要用 san-store,那就不用。

  • 选择 CSS 预处理器:有 3 个可选项, less、 Sass、 stylus,选我们喜欢的。

  • 是否安装依赖,这里可装可不装,这里不装的话之后可以自己装。

最终初始化出来的项目看上去是下面这样的:

图片

hands up:现在我们团队项目中的组件每次创建目录结构也是类似的,所以可以做成脚手架然后使用 `san init` 来安装。

开发:local server、mock

创建完项目,就到了开发阶段。在开发阶段,需要调试页面,那我们可以在命令行里项目目录执行 san serve

执行完之后,命令行会输出一个 URL 和一个二维码,如下图所示:

图片

访问这个 URL 或者扫描这个二维码,就可以看到我们正在开发中的页面了,如下图所示:

我们修改代码后,页面会实时地响应我们的修改,非常方便。

hands up:对于 smarty 我们提供了 `hulk-mock-server` 来做 local server,另外它也集成了接口 mock 功能,可以对接类似 YAPI 之类的 API 管理平台。

部署:生产环境打包和远程部署

开发完成后,如果需要部署到其它的机器上,比如部署到 QA 的机器好让 QA 测试,这时就要用到生产环境的打包。

生产打包也很简单,在命令行里项目目录执行 san build 就行。

执行完之后,我们可以在命令行里看到打包结果的信息,包括产出的文件所在路径、文件大小等,如下图所示:

图片

打包好了就该部署了,San CLI 当然也支持了,我们通过执行 san build --remote <remote-name> 就可以将生产环境的编译产出直接远程部署到目标机器。

不过在执行这个命令前,需要进行相应的环境配置以及参数配置,详见 San CLI 官方文档:https://ecomfe.github.io/san-cli/#/deployment。

其他功能

查看 Webpack 内置信息

有时我们可能对打包的结果不满意,那就可以通过在命令行里项目目录执行 san inspect 来查看 Webpack 所有的内置信息了,如下图所示:

图片

如果只想打印部分内置信息,也是可以的,只需要在执行命令时加上想要查看的内置信息对应的参数即可,比如加上 --rules 或 --rule postcss

图形用户界面

虽然我们名字叫命令行界面(CLI),但是我们也提供了图形用户界面以方便不同习惯的开发者。

只要在命令行执行 san ui 就可以打开 San CLI 的图形用户界面了,如下图所示:

图片

该图形用户界面不只是把在命令行里也能做到的功能图形化了,它还提供了命令行不具备的功能,比如管理项目、阅读新闻等,值得一试,后续我们会有专门介绍该图形用户界面(即 San CLI UI)的文章,敬请期待。

怎么自己定制功能

虽然 San CLI 本身的功能已经覆盖了绝大多数的用 San 开发时的场景,但是如果我们想要定制化的功能,也没问题!

图片

我们可以通过编写插件来扩展 San CLI 的功能,自定义解决方案。

针对 CLI 的使用场景,我们将 San CLI 的插件设计成了两类:

  • Command 插件:命令行插件,用于添加自定义命令,添加完之后我们就可以执行 san your_command_name 这样的自定义命令;

  • Service 插件:当我们想要定制的功能需要用到内置 Webpack 配置 或 san.config.js 里的配置时,就选择开发 Service 插件而不是 Command 插件。

接下来我们以实际的例子分别看下具体怎么自定义 Command 插件和 Service 插件,通过简单例子,理解下两种插件的不同用途。

Command 插件

我们打算给 San CLI 扩展一个 hello 的命令,效果是当我们执行 san hello --name 百度 后,命令行会输出 百度,你好呀!

首先在项目根目录创建一个名为 san-command-hello.js 文件,内容如下:

exports.command = 'hello';
exports.builder = {
    name: {
        type: 'string'
    }
};
exports.desc = '热情地向给定对象打招呼';
exports.handler = argv => {
    console.log(`${argv.name},你好呀!`);
};
  • exports.command:定义命令的名字,这里我们给定义为了 hello

  • exports.builder:定义命令接受的参数和参数类型,这里我们定义命令接受字符串类型的 name 参数;

  • exports.desc:定义命令的描述,即我们在命令行输入 san hello --help 后的输出,这里我们给定义为了 热情地向给定打招呼对象

  • exports.handler:定义输入命令后的处理器函数,这里我们通过处理器函数的 argv 参数拿到了命令接受的 name 参数,然后用它拼接了一个字符串,最后输出这个字符串。

然后在项目的 package.json 文件中添加如下配置:

{
    "san": {
        "commands": ["./san-command-hello.js"]
    }
}

至此,就大功告成了,来看看执行效果:

图片

嗯,令人满意。

另外,我们还可以把我们自定义的命令作为 npm 包发布出去,在这个例子中就是发布 san-command-hello.js 文件,并且遵循 san-cli-command-<whatever-you-like> 的命名方式,比如 san-cli-command-hello,那么,我们就可以在其它项目中直接通过安装这个 npm 包来引入这个自定义命令了。

Service 插件

我们看完了怎么自定义 Command 插件,接下来就来看怎么自定义 Service 插件。

我们打算自定义一个 Service 插件用于获取网站的入口文件。

首先还是在项目根目录,创建一个名为 san-cli-plugin-get-entry.js 文件,内容如下:

module.exports = {
    // 插件 id
    id: 'san-cli-plugin-get-entry',
    // 插件的入口函数
    apply(api, projectOptions, options) {
        api.configWebpack(webpackConfig => {
            console.log('options: ', options)
            console.log('webpackConfig.entry: ', webpackConfig.entry);
        });
    }
};

Service 插件的 apply 函数接受三个参数:

  • api:是 PluginAPI 实例,会提供一些 API,详见 San CLI 官方文档;

  • projectOptions:是 san.config.js 里的处理后的项目配置;

  • options:是项目引入插件时传入的参数。

然后在项目的 san.config.js 文件中添加如下配置:

module.exports = {
    plugins: [
        <span style="./san-cli-plugin-get-entry.js">, '我是项目引入插件时传入的参数'</span>
    ]
};

plugins 是一个 Service 插件数组,里面的每一个 Service 插件又是一个数组,数组第一项是插件的路径,数组第二项是传入插件的参数。

关于 Service 插件的执行时机:当 Service 实例化之时,会依次将 Service 插件进行注册执行。那 Service 什么时候实例化?我们可以简单认为当我们输入 `san init`、`san build` 等命令时 Service 会实例化。

至此,又大功告成了,也来看看执行效果:

图片

可以看到,现在执行 san build 比之前执行多了两行输出,这两行输出就是我们自定义的 Service 插件产生的效果。

嗯,再次令人满意。

当然,和 Command 插件一样,我们也可以把我们自定义的 Service 插件作为 npm 包发布出去,为了方便他人找到我们的优秀 Service 插件,建议按照 san-cli-plugin-* 来命名。当引入一个 npm 包形式的 Service 插件时,只需把原来的插件路径 './san-cli-plugin-get-entry.js' 换成 require('san-cli-plugin-*') 即可。

最后

感谢你阅读到了这里,以上便是《走进 San CLI(上):使用介绍》的全部内容。

San CLI 除了以上介绍的的功能外,还有其它许多功能,比如打包分析、性能分析、自定义项目脚手架、Markdown 建站等等,不一而足,墙裂推荐你体验体验!

图片

我们下期《走进 San CLI(下):实现原理》再见!

期待你的加入

百度开发者中心已开启征稿模式,欢迎开发者登录developer.baidu.com进行投稿,优质文章将获得丰厚奖励和推广资源

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

走进 San CLI(上):使用介绍 的相关文章

  • signature=0fdde99449705347b1bc3148e0519684,ImageOptim-CLI/yarn.lock at master · JamieMason/ImageOpti...

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 34 64 babel code frame 64 7 0 0 34 version
  • 使用HBuilderX-普通项目之vue-cli默认项目开发前端(一)

    第一步 xff1a 新建一个vue cli demo项目 一 vue cli demo项目目录简介 1 node modules 这个目录存放的是项目的所有依赖 xff0c 即 npm install 命令下载下来的文件 2 public这
  • redis cli笔记

    此篇为人个笔记 xff0c 基本是个人常用命令 xff0c 仅供参考 基础操作 redis cli redis span class token number 127 0 span 0 1 637 span class token oper
  • 重装@angular/cli reason: write EPROTO 139955972261696:error:1408F10B:SSL routines:ssl3_get_record:wron...

    前几天不小心卸载了 angular 64 cli 然后重装的时候发现 xff0c 一直报错 如下 xff1a 64 ln622653 npm install g 64 angular cli npm ERR code EPROTO npm
  • truffle+ganache-cli构建简单以太坊智能合约并编译部署

    以前接触过以太坊工具链来做区块链练手项目 xff0c 后来荒废了 xff0c 如今再次捡起来 xff0c 算是回忆和加深 之前可能因为网络的原因 xff0c 在truffle各种初始化编译合成智能合约都遇到了好多问题 xff0c 如今再次尝
  • vue-cli 插件开发补充

    官网地址 xff1a https cli vuejs org zh api地址 xff1a https cli vuejs org dev guide plugin api html Plugin API api version 64 vu
  • 【Github CLI】Take GitHub to the command line

    目录儿 一 Git Github GitLab二 Github CLI gh2 1 gh简介2 2 gh的使用2 21 Github身份验证 xff08 必选 xff09 2 22 常用命令 xff08 1 xff09 在Github仓库中
  • ovsdb <10> Ops-cli结合ovsdb部分流程及接口分析

    4 6Ops cli结合ovsdb部分流程及接口分析 Ops中对于ovsdb的应用主要是基于上述的ovsdb的简单用法上的一个扩展和函数封装 xff0c 现在就其与之前不同的地方做补充说明并就各个函数的使用做相应的说明 根据前面的ovsdb
  • 在vue-cli中使用vue-property-decorator装饰器

    安装 npm i s vue property decorator 如果你的项目是安装了TS那么就可以直接使用 xff0c 如果没有安装TS但是还是想用vue property decorator装饰器那么就还需要去配置一下了 使用vue
  • 使用 Helm Cli 将 chart 推送到 Harbor

    使用 Helm Cli 将 chart 推送到 Harbor 背景问题 努力寻找适用于特定版本的 Harbor 和 Helm 的文档 我尝试添加我的仓库 xff08 repo xff09 helm repo span class token
  • 01-搭建Vue脚手架(vue-cli)

    一 那么我们就从最简单的环境搭建开始 xff1a 安装node js xff0c 从node js官网下载并安装node xff0c 安装过程很简单 xff0c 一路 下一步 就可以了 xff08 傻瓜式安装 xff09 安装完成之后 xf
  • AWS CLI version 2 在 Windows 下的安装

    首先你需要到下面的链接地址中下载需要的应用 xff1a https awscli amazonaws com AWSCLIV2 msi 双击运行 双击运行下载的可以运行的文件 下一步继续 下一步继续安装进程 许可协议 你需要同意许可协议后继
  • vue-cli-service Axios 持续返还401

    后端 xff1a 在登录超时或没有登录的情况 xff0c 所有请求都会拒绝并且返还HTTP状态码401 前端 xff1a 前端将认证的Token放到loadStorage中 xff0c 在认证失效时候清空 在接到HTTP状态码为401时 x
  • 百度交易中台之账房系统架构浅析

    导读 百度交易中台作为集团移动生态战略的基础设施 面向收银交易与清分结算场景 为赋能业务提供高效交易生态搭建 目前支持百度体系内多个产品线 主要包含 小程序 地图打车 百家号 招财猫 好看视频等 本文主要介绍了百度交易中台的商户财务对账相关
  • 开发自己的脚手架(Rollup+Typescript)-(02)-(中间件模式)

    对于A gt b gt c这一类的流程事件 可以采用分解这些事件 当需要用到这些事件操作时 我们将操作插入到核心事件完成所需要的不同步骤中 实现一个流程处理函数 src core ware ts 中间件方法类型 export type Mi
  • 百度APP视频播放中的解码优化

    背景 在全民视频的时代 百度APP中视频播放是十分重要的业务 随着 5G 的到来 视频播放已经不满足以前的标清 高清 超清乃至于 4K 已经是旧时王谢堂前燕飞入寻常百姓家 越来越清晰的视频源 越来越复杂的视频编码 对 APP 的视频解码能力
  • 使用cobra创建cli命令行工具

    什么是cobra Cobra既是用于创建强大的现代CLI应用程序的库 也是用于生成应用程序和命令文件的程序 Cobra是一个库 提供了一个简单的界面来创建类似于git go工具的强大的现代CLI界面 Cobra也是一个应用程序 它将生成您的
  • 走进 San CLI(下):实现原理

    作者 胡粤 上期我们讨论了 San CLI 的使用 这期我们再深入一点 来看看 San CLI 的实现原理 核心模块和核心概念 为了方便理解下文的 San CLI 的整体工作流程 主流程 我们先来看下 San CLI 的核心模块和核心概念
  • 18M 超轻量系统开源

    图像识别作为深度学习算法的主流实践应用方向 早已在生活的各个领域发挥作用 如安全检查和身份核验时的人脸识别 无人货架和智能零售柜中的商品识别 这些任务背后的关键技术都在于此 图1 PP ShiTu应用于商品识别效果示意 开发者应用展示 然而
  • 蓝翔:百度开源深度学习平台飞桨的核心技术及应用

    分享嘉宾 蓝翔 百度 资深研发工程师 编辑整理 张兰兰 人民银行 出品平台 DataFunTalk 导读 近期 DataFunSummit AI基础软件架构峰会以线上形式成功召开 其中深度学习框架论坛更是云集了各大著名科技企业的顶级专家 来

随机推荐

  • Take Control

    Turn Off Notifications Remove Toxic Apps Remove apps that profit off of addiction distraction outrage polarization and m
  • 【HTML基础汇总】

    HTML 前期整体脉络 2017年1月7日 14 23 24 0 序 HTML 前期整体脉络 序 前言 总览 HTML 基础 1 HTML简介 11 什么是标记语言 2 HTML 基础结构 3 标签 31 什么是标签 32 块元素标签 32
  • 一起实战Springboot开发后端管理系统4:数据库连接池Druid和HikariCP

    上一篇文章主要讲解了如何再Matrix Web中使用Mybatis Plus Mybatis Plus作为Orm框架 连接数据库需要连接数据库的依赖 WEB 系统高并发环境下 频繁的进行数据库连接操作 造成系统技术瓶颈问题 无效的资源开销
  • 剑指offer第二版面试题5:替换空格(java)

    题目 请实现一个函数 把字符串中的每个空格替换成 20 例如输入 We are happy 则输出 We 20are 20happy 说明 在网络编程中 如果URL参数中含有特殊字符 如 空格 等 可能导致服务器端无法获得正确的参数值 我们
  • [OtterCTF 2018]之Misc篇(NSSCTF)刷题记录⑦

    NSSCTF Misc篇 OtterCTF 2018 OtterCTF 2018 General Info OtterCTF 2018 Play Time OtterCTF 2018 Silly Rick OtterCTF 2018 Wha
  • linux 查看端口被哪个进程占用

    linux 查看端口被哪个进程占用及对应程序安装地址 查询端口被哪个进程占用 查看进行号28998对应的物理地址 杀掉1827号进程 查询端口被哪个进程占用 查看9995端口被哪个进程占用 lsof i tcp 9995 查看进行号2899
  • Mac系统下android studio无法识别手机

    1 设置 辅助功能 开发人员工具 勾选 USB调试 允许模拟位置 这两项 2 将手机连接电脑 选择连接方式 媒体设备 MTP 3 打开mac电脑的 关于本机 系统报告 系统信息硬件中找到USB USB设备中找到连接的手机 在下面栏中找到 厂
  • db2 xml 转 table【XQuery系列】

    版本 DB2 Version 9 1 1 创建测试表 初始化数据 create table emp doc XML INSERT INTO EMP VALUES
  • 机考[71-80]

    华为机考 071 整数编码 072 整数对最小和 073 整型数组按个位值排序 074 执行时长 075 字符串变换最小字符串 076 字符串分割 077 字符串加密 078 字符串筛选排序 079 字符串统计 080 字符串序列判定 07
  • docker命令学习

    docker运行mysql并允许外网访问 docker run p 3306 3306 name mysql e MYSQL ROOT PASSWORD 123456 d docker io mysql latest p 外网映射 e设置m
  • 13. Jupyter Notebook介绍、安装及使用

    一 什么是Jupyter Notebook 1 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序 其可被应用于全过程计算 开发 文档编写 运行代码和展示结果 Jupyter Notebook官方介绍 简而言之 Jup
  • 《电子相框》--2.fb设备与图片显示

    接着上一篇博客的总结 继续项目的技术点展示 一 fb设备显示图片基础的步骤 1 确定打开的设备 一般设备在 dev fbxx 2 两个与显示有关的结构体变量 struct fb fix screeninfo finfo struct fb
  • ajax加密url参数,JS加解密URL参数encodeURIComponent() decodeURIComponent()

    参考1 http www w3school com cn js jsref encodeURIComponent asp 参考2 http www w3school com cn js jsref decodeURIComponent as
  • JS原型详解

    原型 原型是 JavaScript 面向对象特性中重要的概念 也是大家太熟悉的概念 因为在绝大多 数的面向对象语言中 对象是基于类的 例如 Java 和 C 对象是类实例化的结果 而在 JavaScript 语言中 没有类的概念 对象由对象
  • 用NCL将GRIB/GRIB2文件转成nc文件(批量转),JRA-55再分析为例

    背景 答主最近需要用到JRA 55再分析数据 但在面对GRIB数据格式时犯难了 便想把GRIB格式转成nc文件再做分析 因为nc文件很容易用python或Matlab处理 尝试了好些方法 发现先安装NCL再用ncl来批量转换 是一种比较便捷
  • windows下安装RabbitMQ

    目录 windows下载与安装 启动RabbitMQ 本篇博客下安装的均是目前最新版本 windows下载与安装 RabbitMQ官网 https www rabbitmq com 截止到现在RabbitMQ最新版本是3 10 7 Rabb
  • 【UE4】TSubclassOf模板类

    TSubclassOf是提供UClass类型安全性的模板类 模板类告知编辑器的属性窗口 只显示派生自AFPSProjectileActor的类 同时 这个参数在代码中也只接受派生自AFPSProjectileActor的类 当不加TSubc
  • docker标准输出日志存储位置,设置docker日志文件大小

    目录标题 docker日志存储位置 docker容器日志导致磁盘空间爆满 设置docker容器日志大小 全局设置 k8s中的容器日志 docker日志存储位置 在Linux系统中docker启动后日志存储在 var lib docker c
  • JSON parse error: Cannot deserialize value of type `java.util.Date` from String 2023-02-19 00:00:00

    问题描述 正常post请求然后接日期参数的时候报的异常 解决方案 添加 JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 DateTimeFormat是用来格式化parm传参的 而接
  • 走进 San CLI(上):使用介绍

    本文是 San CLI 的使用和原理的第一篇 主要介绍 San CLI 的初衷和使用 下一篇介绍具体的实现原理 什么是 CLI CLI 是命令行界面 command line interface 的英文缩写 命令行界面是在图形用户界面得到普