node动态生成html,实战 | HTML页面生成器:使用JavaScript和Node创建CLI

上一篇文章:实战 | 从零开始使用JavaScript制作自己的命令行(CLI工具) 中介绍了如何从零开始制作CLI,只是一个简单的示例,今天更进一步,来制作一个实际的程序,生成HTML模板。

在这篇文章中,我们将构建一个简单的CLI,允许用户生成HTML页面。我们首先要生成一个标准的空白页面,然后让用户输入参数,比如文件名和标题,先通过选项,然后通过提示问题让用户输入参数。

创建 Hello World CLI

创建用于编写CLI的文件夹。我将其命名为 html-generator-cli。打开一个终端,然后在此文件夹中运行:

npm init

该命令会有几个问题要问你,顺便说一下,这正是我们最终希望在空白HTML页面生成器中包含的内容。这将在文件夹中生成 package.json 文件:

1460000022579853

我们需要创建包的 index.js 文件作为入口在package.json中引入。在这个文件中,写入下面代码:

console.log('Hello World!');

现在我们需要创建运行这段代码的命令。

{

"name": "html-generator-cli",

"version": "1.0.0",

"description": "",

"main": "index.js",

"scripts": {

"test": "echo \"Error: no test specified\" && exit 1"

},

"keywords": [],

"author": "",

"license": "ISC",

"bin": "index.js"

}

将最后一行添加到package.json中。现在,我们可以测试我们非常简单的CLI。在项目文件夹中局安装我们新创建的包到本机:

npm install -g ../html-generator-cli

打开一个新终端并运行:

html-generator-cli

如果您使用Windows,现在应该会看到“Hello World!”。在您的终端中。如果您使用的是基于UNIX的操作系统,则应该得到一个错误,可能与语法错误和意外的token有关。我本人用的是Mac,结果人如下

1460000022579850

这是因为与Windows不同,基于UNIX的系统不关心文件的扩展名(此处为“.js”),因此不知道使用哪种语言。我们必须告诉系统使用Node运行脚本。为此,我们在文件的开头添加一条注释行:

#!/usr/bin/env node

console.log('Hello World!');

创建一个空白的HTML页面

我们要创建一个CLI来生成HTML文件,为此,我们将使用Node.js文件系统模块。该模块是Node内置模块,提供与文件系统交互的API,也就是说可以创建、读取、修改和删除文件。我们只需要使用文件系统模块的 writeFile 方法即可,该方法允许你创建文件。

#!/usr/bin/env node

const fs = require('fs');

const html = `

Title

`;

fs.writeFile('index.html', html, error => {

if (error) {

console.log(error);

}

});

如果您再次在终端中保存并运行 html-generator-cli,现在应该在文件夹中看到一个 index.html 文件。

将参数传递给代码

现在我们生产的文件名和HTML中的 title 标签内容是写死的,我们应该可以将文件名和标题作为参数传递给CLI。要传递参数,你只需在命令之后写上参数,然后这些参数就可以在一个名为 argv 的变量中提供给进程。

在代码中编写如下代码:

const args = process.argv;

console.log(args);

并在终端中运行它:

html-generator-cli hello haha

然后,你应该在控制台中看到一个包含参数作为字符串的数组:

1460000022579852

传递的参数在数组的最后两项,我们只需要使用数组的 slice(2) 方法即可拿到。我们决定第一个输入参数是文件名(不带HTML扩展名),第二个参数将是HTML页面的标题。这些参数都不是必需的,如果没有提供名称和标题,则我们将文件称为index.html,标题为“Title”。

#!/usr/bin/env node

const fs = require('fs');

const args = process.argv.slice(2);

let fileName = args[0] ? `${args[0]}.html` : 'index.html';

let title = args[1] || 'Title';

const html = `

${title}

`;

fs.writeFile(fileName, html, error => {

if (error) {

console.log(error);

}

});

我们保持简单,不验证用户输入的情况,用户可能会给该文件指定了无效的名称,这是你在实际工作中必须验证的内容。

现在,你可以在终端中尝试以下操作:

html-generator-cli page "new generator"

结果

1460000022579851

使用参数选项

先前的方法易于实现,但有一些缺点:用户必须知道期望哪些参数以及以什么顺序。如果他不想给出文件名,他也没有办法给出标题,我们可以通过创建选项来改善这一点。

与其一个接一个地写参数,我们可以构建我们的CLI,让用户输入类似于这样的文件名和/或标题。

html-generator-cli --file-name page --html-title "new generator"

写起来有点长,但是用户更清楚他给出的参数是什么,顺序不再起作用,你可以给出一个标题,即使你没有给出任何文件名。

const args = process.argv;

const FILE_NAME_OPTION = '--file-name';

const HTML_TITLE_OPTION = '--html-title';

const fileNameOptionIndex = args.findIndex(arg => arg === FILE_NAME_OPTION);

const htmlTitleOptionIndex = args.findIndex(arg => arg === HTML_TITLE_OPTION);

const fileNameOption = fileNameOptionIndex > -1 && args[fileNameOptionIndex + 1];

const titleOption = htmlTitleOptionIndex > -1 && args[htmlTitleOptionIndex + 1];

let fileName = fileNameOption ? `${fileNameOption}.html` : 'index.html';

let title = titleOption || 'Title';

现在,我们在参数数组 args 中获得选项 --file-name 或 --html-title 的索引。如果存在一个选项,那么要给文件名或标题的值就是参数数组中 --file-name 或 --html-file 之后的元素。如果不存在选项,则其索引将为 -1。如果此索引为 -1 或参数数组中该选项之后没有任何值,我们分别为文件名或标题提供默认值。其余代码未更改。

你可以运行新的CLI,如果没有选择,它将创建标题为“Title”的index.html文件。如果你编写一个选项但忘记提供一个值,它将也提供默认值。如果你正确地使用给定的选项编写命令,那么它应该创建一个具有正确名称和正确HTML标题的文件。

html-generator-cli --file-name hello --html-title "CLI helloworld!"

效果

1460000022579855

同样,在实际的CLI中,你会希望多检查一些输入,首先要确保用户输入的值是有效的,但也要在缺失值或选项出现两次的情况下警告他们。

向用户询问参数

使用选项已经是一种改进了,但是它仍然需要用户知道他可以传递什么参数以及使用哪个标记。当你初始化你的npm项目时,你可以通过很多东西作为选项。CLI会直接问您一些问题,因此您无需阅读文档即可了解如何提供项目名称,版本等信息。

要从控制台读取用户输入,我们需要Node(自版本7)提供的模块 readline。你可以使用以下代码在终端中对其进行测试:

const readline = require('readline');

const interface = readline.createInterface({

input: process.stdin,

output: process.stdout

});

interface.question('你叫什么名字?', answer => {

console.log(`Hello ${answer}`);

interface.close();

});

效果如下

1460000022579856

为了生成我们的HTML页面,我们首先要询问文件名,然后询问标题。如果用户没有输入任何内容,我们将获得默认值。我们向用户显示默认值是什么,以便在默认值正确的情况下可以跳过该问题。

#!/usr/bin/env node

const fs = require('fs');

const readline = require('readline');

let fileName = 'index.html';

let title = 'Title';

const interface = readline.createInterface({

input: process.stdin,

output: process.stdout

});

interface.question(`File name (${fileName}): `, answer => {

if (answer && answer.length) {

fileName = `${answer}.html`;

}

interface.question(`HTML title (${title}): `, answer => {

if (answer && answer.length) {

title = answer;

}

interface.close();

const html = `

${title}

`;

fs.writeFile(fileName, html, error => {

if (error) {

console.log(error);

}

});

});

});

如果你在终端中运行它,将会询问两个问题。

1460000022579854

用户不必了解您的CLI选项,所有重要的事情都可以直接询问。但是,你应该只以这种方式询问主要配置问题,并让用户阅读文档以了解不太常见的选项。

结束

我们使用Node和npm创建了一个简单的CLI,允许用户生成一个空白的HTML文件,是不是非常简单?你可以通过添加新选项并验证用户输入来改进此示例。

文章首发《前端外文精选》微信公众号

bVbFBCS

继续阅读其他高赞文章

只有橘子
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nodejs如何动态生成html页面,nodejs 简单实现动态html的方法
weixin_39622643的博客
06-05 2606
动态替换html内容1.实现的功能及原理实现了将,用户表单的数据,与html相结合,将用户输入的数据,显示到html对应的位置。原理:通过正则表达式,替换html中的模板数据 如用户名{name},可以通过拿到用户提交的name的值value,通过replace(正则表达式,value)的方式替换掉原模板数据,并输出到客户端。2.主要用到的方法和模块2.1文件操作模块 var fs=require...
nodejs 简单实现动态html
热门推荐
improve-chen的博客
08-21 1万+
动态替换html内容 1.实现的功能及原理 实现了将,用户表单的数据,与html相结合,将用户输入的数据,显示到html对应的位置。 原理:通过正则表达式,替换html中的模板数据 如用户名{name},可以通过拿到用户提交的name的值value,通过 replace(正则表达式,value)的方式替换掉原模板数据,并输出到客户端。 2.主要用到的方法和模块 2.1文件操作模块 va
nodejs 简单实现动态html的方法
10-18
今天小编就为大家分享一篇nodejs 简单实现动态html的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Node.js 中 HTML 解析全面指南:探索不同的方法
最新发布
weixin_71807218的博客
03-17 1115
Node.js 提供了多种方法来解析 HTML,包括 Cheerio、jsdom 和 htmlparser2。选择适合你需求的库,可以轻松地操作和提取网页内容。这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
Nodejs创建HTML、CSS、JS页面
lihefei_coder的博客
03-19 3992
const express = require('express'); const app = express(); const hostname = '127.0.0.1'; const port = 8999; const host = hostname + ':' + port; /** * 封装get请求 * @param {object} params 配置项 * @param ...
nodejs将md文件转为html文件
weixin_42170906的博客
03-08 1087
作为一名程序员;难免要写markdown文档; 但是写出来的md文档如果发给没装markdown阅读器的同事来看的话;就看起来太难受了; 于是就简单写了点脚本;一键将md文件转为html
generator-node-cli:节点命令行应用程序生成器
05-16
generator-node-cli 节点命令行应用程序生成器。安装首先,使用安装和generator-node-cli(我们假设您已经预安装了 )。 npm install -g yonpm install -g @clarketm/generator-node-cli 然后生成您的新项目: yo @...
uw-u10-employees:使用Node CLI的员工摘要页面生成器
02-14
目录 点击查看Google云端硬盘上的完整尺寸视频正在安装git clone仓库运行npm i以安装所需的软件包用法运行node index.js以启动生成器回答提示,直到您添加了团队中所有员工的信息“您想做什么?” 提示重复广告无限...
generator-node-cli-commander:节点命令行应用程序生成器
05-16
generator-node-cli-commander 节点命令行应用程序生成器。安装首先,使用安装和generator-node-cli-commander(我们假设您已经预安装了 )。 npm install -g yonpm install -g generator-node-cli-commander 然后...
team-profile-generator:使用JavaScriptnode.js构建的CLI应用程序,用于为专业团队创建HTML页面
02-09
团队资料生成器一个使用JavaScriptnode.js构建的CLI应用程序,用于为专业团队创建HTML页面
markdown-generator:基于node.js的CLI md生成器
04-18
基于node.js的CLI md生成器,可轻松设置以编写标记内容。 特别是基于JavaScript的静态网站生成器(例如Gatsby,Next.js)的用户。 用法 node_module./bin mdg today_whether # => blog/today_whether.md 配置 我建议...
Node.js-Nodejs的简化HTMLCSS->PDF生成器
08-10
Nodejs的简化 HTML CSS - >PDF 生成器
nodejs创建服务并加载一个html文件
weixin_30624825的博客
04-22 346
var http=require("http");//导入文件模块var fs=require("fs");var server =http.createServer(function(req,res){ //控制台打印信息 console.log("server is working"); //结束服务器响应,注:没有res.end(),打开网页时,页面将处于一直加载的状态 ...
Node.js快速创建一个访问html文件的服务器
毛毛虫博客
01-07 2094
var http = require('http'), // 引入需要的模块 fs = require('fs'), //引入文件读取模块 cp = require('child_process'), // 可自动打开浏览器模块 url = require("url"), path = require("path"); http.createServer(function (...
NodeJs 中的 HTML 模板
努力是为了站在万人之中,成为别人的光
03-01 8091
HTML 模板是一种允许我们创建基本 HTML 结构并使用占位符根据从 JSON 文件或数据库中检索到的数据动态生成内容的技术。让我们考虑一个假设实例,其中我们的网站包含许多产品卡,每个卡都包含从 JSON 文件中检索到的特定产品详细信息。现在,如果我们要从 JSON 文件中添加或删除任何产品,我们将如何在前端动态更新相应的卡片?考虑到我们基于内容的数据存储在 JSON 文件中,我们可以继续从现有的 HTML 代码创建可重用的模板。作为开发人员,您可能熟悉提供动态 Web 内容的概念。实现这一目标的一种方法
动态生成html文件
Df's blog
04-18 707
#include"stdio.h" main() { FILE *a; int x1,x2,N1=99,N2=60; char FileName[100]; for(x1=10;x1<N1;x1++) { sprintf(FileName,"c:\\0%d.htm",x1); a=fopen(FileName,"w"); if(a==NULL) { printf("file be opene...
node.js 写html table,HTML table in pdfkit (Expressjs-Nodejs)
weixin_31766871的博客
06-28 122
Well there's no easy to do it directly with PDFKit. You have to implement the table rendering logic yourself. If you wanna do it simply, you just have to realize that tables are just a bunch of rectan...
[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件
weixin_33982670的博客
09-18 103
这个周末,恶补了一下jade模板引擎,就为生成静态html文件,这篇文章需要知道jade以及看过我的上篇文章,我先给出他们的参考链接: [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法 [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义 [js高手之路]Node.js模板引擎教程-jade速学与实战3-mixin [js高手之...
node.js 将HTML分割为单独的html 、css、js文件。
weixin_44717047的博客
07-06 846
node.js 将HTML分割为单独的html 、css、js文件。
node后端项目怎么webpack打包
05-15
Node后端项目是使用JavaScript语言编写的,这意味着我们可以使用Webpack对其进行打包,从而生成一个可执行的文件,以便在服务器端运行。 首先,需要在项目中安装Webpack及其相关依赖。可以使用以下命令: ``` npm install webpack webpack-cli -D ``` 接下来,创建一个新的Webpack配置文件。在配置文件中,需要指定入口文件、输出路径以及要使用的加载器和插件等配置信息。 以下是典型的Webpack配置文件示例: ```javascript const webpack = require('webpack'); const path = require('path'); module.exports = { entry: './src/index.js', target: 'node', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist'), }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] }, plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }) ] }; ``` 在上面的配置中,首先使用Node.js内置的path模块来解析出输出文件夹的绝对路径,然后指定了入口文件和输出文件名和路径。还配置了Babel加载器来转译ES6以上语法,并且使用了一个定义插件来指定项目的环境为生产环境。 最后,可以使用以下命令来运行Webpack打包: ``` npx webpack --config webpack.config.js ``` 这样就可以生成一个打包后的文件,可供在Node.js环境中运行,并能够正常访问API接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • cxjky.com forum.php,webshell/xiao.php.txt at master · tennc/webshell · GitHub 186965
  • 锁定计算机耗电吗,电脑一天的耗电量是多少?不算不知道 一算吓一跳! 9728
  • 图像识别_什么是图像识别? 6212
  • html的color粉颜色,HTML颜色一览(color) 5463
  • python如何跳出函数_python如何跳出函数 3978

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 适合英文seo网站的服务器,「深圳英文seo」更换网站服务器对网站排名的影响
  • 微信公众号成本分析服务器,分析:为什么微信公众号用户获取成本比App还高?...
  • 2012r2无盘服务器,Windows运维之Windows Server 2012 R2 路由功能部署
2021年150篇
2020年22篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司景德镇网站定制推荐福州关键词排名报价和田网络推广哪家好中卫网站改版报价韶关企业网站设计公司嘉兴建站价格海口阿里店铺托管多少钱玉林网站建设设计公司镇江营销网站价格合肥设计公司网站报价杭州模板网站建设推荐聊城模板网站建设价格滨州网站设计多少钱重庆网站seo优化推荐泰州网页制作报价南阳推广网站报价怒江网站改版多少钱福永SEO按天计费多少钱常州英文网站建设价格邢台高端网站设计推荐内江关键词排名公司潜江阿里店铺运营公司信阳seo优化价格石岩百搜标王公司咸宁网页设计多少钱木棉湾英文网站建设公司合肥seo排名报价榆林SEO按效果付费报价营口SEO按天扣费大运百度爱采购公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化