likes
comments
collection
share

node版本管理器nvm和写一个实战小demo 文章生成器(一)

作者站长头像
站长
· 阅读数 25

node.js有很多版本需要管理,下一个版本管理器nvm进行管理

node版本管理器nvm和写一个实战小demo 文章生成器(一)

一路接受,配置好环境变量。默认在C盘自动会添加好环境变量,D盘需要手动配置。

node版本管理器nvm和写一个实战小demo 文章生成器(一)

这样显示表示安装完成

node版本管理器nvm和写一个实战小demo 文章生成器(一)

查找可以下载的板块 LTS是稳定版本,20.16.0是昨天刚更新的稳定版本,直接下载

node版本管理器nvm和写一个实战小demo 文章生成器(一)

下载完以后直接使用就行了

node版本管理器nvm和写一个实战小demo 文章生成器(一)

这里也是直接查看版本说明node也下好了使用上了

node版本管理器nvm和写一个实战小demo 文章生成器(一)

在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
}


  1. path.resolve去把相对路径变成绝对路径
  2. fs.readFileSync(_path, 'utf8')同步的读取文件编码规则为utf8
  3. JSON.parse(data) 返回一个JSON对象数据
  4. 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
}
  1. const { randomInt, createRandomPicker } = require('./random.js')解构出randomInt, createRandomPicker这个两个函数
  2. 数组的map()方法,将famousbosh_beforeboshconcludesaid这五个变量分别传递给createRandomPicker函数,并将返回的结果分别赋值给pickFamouspickBoshBeforepickBoshpickConcludepickSaid这五个变量。
  3. section += sentence(pickFamous, {said: pickSaid, conclude: pickConclude})因为我们在句子中放入了两个占位符让一句话更难重复,更多的选择空间
  4. new RegExp({{${key}}}, 'g')为正则表达式对象,用于匹配模板字符串中以{{开头,}}结尾的特定变量,其中key代表了要匹配的变量名
  5. CommonJS中导入导出的requiremodule.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
}
  1. Math.floor(min * (1-n) + max *n) n在0到1之间为随机因子,平均比例就能拿到最小值和最大值之间的一个随机数了
  2. 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)

这样你就得到一个篇完成随机生成的人工智障的文章

node版本管理器nvm和写一个实战小demo 文章生成器(一)

数据有点大,如果感兴趣私信,自己玩一下这个项目。

转载自:https://juejin.cn/post/7395413975976001570
评论
请登录