node版本管理器nvm和写一个实战小demo 文章生成器(一)
node.js有很多版本需要管理,下一个版本管理器nvm进行管理
- nvm下载地址:Releases · coreybutler/nvm-windows · GitHub在github上魔法上网快一点
一路接受,配置好环境变量。默认在C盘自动会添加好环境变量,D盘需要手动配置。
这样显示表示安装完成
查找可以下载的板块 LTS是稳定版本,20.16.0是昨天刚更新的稳定版本,直接下载
下载完以后直接使用就行了
这里也是直接查看版本说明node也下好了使用上了
在vscode中也有node了
接下来完成实战小demo-文章生成器
当然我这个小项目生成的文章是人工智障,都是交给概率随机生成的。
设计理念就是给一个数据里有title和famous, bosh_before, bosh, conclude, said这些东西,然后随机将这些数据拼接起来,构成一篇文章。
设计图
corpus
index
generator
random
server
语料库和生成器和随机数三个模块去完成生成文章的功能在index里,再用index在server.js在跑在服务器上
设计语料库,让语料库中有加载和保存的两个功能
const fs = require('fs');
const path = require('path');
function loadCorpus(src) {
const _path = path.resolve(__dirname, '..',src)
const data = fs.readFileSync(_path, 'utf8')
return JSON.parse(data)
}
function saveCorpus(title,article) {
const _path = path.resolve(__dirname , '..','output')
//const
const time = Date.now()
const file = path.resolve(_path,`${title}${time}.txt`)
const text = `${title}\n\n ${article.join('\n')}`
fs.writeFileSync(file, text)
}
module.exports = {
loadCorpus,
saveCorpus
}
path.resolve
去把相对路径变成绝对路径fs.readFileSync(_path, 'utf8')
同步的读取文件编码规则为utf8JSON.parse(data)
返回一个JSON对象数据const time = Date.now()
添加一个事件戳,让文件创建名不重复
文章生成,有生成文章和文本替换两个函数
const { randomInt, createRandomPicker } = require('./random.js')
// 生成文章
function generate(title, { corpus, min = 1000, max = 2000 }) {
const articleLength = randomInt(min, max)
const { famous, bosh_before, bosh, conclude, said } = corpus
const [pickFamous, pickBoshBefore, pickBosh, pickConclude, pickSaid]
= [famous, bosh_before, bosh, conclude, said].map(createRandomPicker)
const article = []
let totalLength = 0
while(totalLength < articleLength ) { // 生成文章
let section = ''
const sectionLength = randomInt(100, 500)
while (section.length < sectionLength) {
const n = randomInt(0, 100)
if (n < 20) { // 名人名言
section += sentence(pickFamous, {said: pickSaid, conclude: pickConclude})
} else if (n < 50) { // 前置废话
section += sentence(pickBoshBefore, {title}) + sentence(pickBosh, {title})
} else { // 废话
section += sentence(pickBosh, {title})
}
}
totalLength += section.length
article.push(section)
}
return article
}
// 文本替换
function sentence(pick, replacer) {
let res = pick() // xxxxxx{{said}}xxxxx{{conclued}}x
for (let key in replacer) {
// new RegExp(`{{${key}}}`, 'g')
// replacer[key]()
res = res.replace(
new RegExp(`{{${key}}}`, 'g'),
typeof replacer[key] === 'function' ? replacer[key]() : replacer[key]
)
}
return res
}
module.exports = {
generate,
sentence
}
const { randomInt, createRandomPicker } = require('./random.js')
解构出randomInt, createRandomPicker这个两个函数- 数组的
map()
方法,将famous
、bosh_before
、bosh
、conclude
和said
这五个变量分别传递给createRandomPicker
函数,并将返回的结果分别赋值给pickFamous
、pickBoshBefore
、pickBosh
、pickConclude
和pickSaid
这五个变量。 section += sentence(pickFamous, {said: pickSaid, conclude: pickConclude})
因为我们在句子中放入了两个占位符让一句话更难重复,更多的选择空间new RegExp(
{{${key}}}, 'g')
为正则表达式对象,用于匹配模板字符串中以{{
开头,}}
结尾的特定变量,其中key
代表了要匹配的变量名- CommonJS中导入导出的
require
和module.exports
随机文本数量和随机去一个从模块中
function randomInt(min,max) {
const n =Math.random()
return Math.floor(min * (1-n) + max *n)
}
function createRandomPicker(arr){
arr = [...arr]
function randomPick(){
const len = arr.length - 1
const index = randomInt(0,len);
[arr[index],arr[len]] = [arr[len],arr[index]]
return arr[index]
}
randomPick() //放弃第一次
return randomPick
}
module.exports = {
createRandomPicker,
randomInt
}
Math.floor(min * (1-n) + max *n)
n在0到1之间为随机因子,平均比例就能拿到最小值和最大值之间的一个随机数了createRandomPicker(arr)
就是一个简单的算法让它不要相邻生成同一个关键词,也可以用lastword去记录然后判断也能达成算法
用这个index把前面的模块整合起来,这样跑服务器的时候能一起调用
const { loadCorpus,saveCorpus } =require('./lib/corpus.js')
const { generate } = require('./lib/generateor.js');
const { createRandomPicker } = require('./lib/random.js')
let article = []
let title = ''
function handle(){
const corpus = loadCorpus('corpus/data.json')
title = createRandomPicker(corpus.title)()
article.push(...generate(title,{corpus}))
saveCorpus(title, article)
return title
}
module.exports = {
article,
handle,
title
}
创建一个服务器
const http = require('http')
const fs = require('fs')
const {article,handle} = require('./index')
const title = handle()
const server = http.createServer((req,res) =>{
if(req.url === '/'){
let html = fs.readFileSync(__dirname + '/index.html','utf-8')
const regTitle = new RegExp('{{ title }}','g')
html = html.replace(regTitle,title)
const reg = new RegExp('{{ article }}','g')
html = html.replace(reg,article.join('<br> <br>'))
res.end(html)
}
})
server.listen(3000)
这样你就得到一个篇完成随机生成的人工智障的文章
数据有点大,如果感兴趣私信,自己玩一下这个项目。
转载自:https://juejin.cn/post/7395413975976001570