Nodejs keystone可以生成静态的html文件么,相当于动转静

Nodejs keystone可以生成静态的html文件么,相当于动转静

要给别人写个公司网站,但是不想一页页写,所以想在本地搭个动态网站,做好后把静态的上传上去。不晓得可以动转静么?

5 回复

要给别人写个公司网站,但是不想一页页写,所以想在本地搭个动态网站,做好后把静态的上传上去。不晓得可以动转静么?


直接使用 动态的不可以? save as html? :)

当然可以!Node.js 和 KeystoneJS 可以帮助你创建一个动态网站,并在完成后将其转换为静态 HTML 文件。这样你可以将这些静态文件上传到任何静态网站托管服务(如 GitHub Pages、Netlify 或 Vercel)。

以下是一个简单的步骤指南以及示例代码,展示如何使用 KeystoneJS 生成静态 HTML 文件。

步骤指南

  1. 安装 KeystoneJS
  2. 创建 KeystoneJS 项目
  3. 添加页面和数据模型
  4. 配置生成静态文件的脚本

示例代码

1. 安装 KeystoneJS

首先,确保你已经安装了 Node.js。然后创建一个新的 KeystoneJS 项目:

npm init -y
npm install keystone-next@latest

2. 创建 KeystoneJS 项目

创建一个基本的 KeystoneJS 配置文件 keystone.js

const { Keystone } = require('@keystonejs/keystone');
const { Text, Password, Checkbox, Select, Relationship } = require('@keystonejs/fields');

const keystone = new Keystone({
  name: 'My Website',
  adapter: new Adapter({ dbUri: 'sqlite://./keystone.db' }),
});

keystone.createList('Post', {
  fields: {
    title: { type: Text },
    content: { type: Text },
  },
});

module.exports = keystone;

3. 添加页面和数据模型

你可以根据需要添加更多的数据模型和页面。例如,添加一个 Page 模型来管理静态页面内容:

keystone.createList('Page', {
  fields: {
    title: { type: Text },
    content: { type: Text },
  },
});

4. 配置生成静态文件的脚本

为了生成静态 HTML 文件,你可以使用 keystone-export 插件。首先安装该插件:

npm install @keystonejs/exporter

然后修改你的 keystone.js 文件以包含导出功能:

const Exporter = require('@keystonejs/exporter');

// 在 Keystone 实例中添加 Exporter
keystone.extendConfig({
  plugins: [
    new Exporter({
      exportPath: './public',
      templates: {
        page: 'templates/page.hbs',
      },
    }),
  ],
});

module.exports = keystone;

创建一个 Handlebars 模板文件 templates/page.hbs 来定义页面结构:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>{{title}}</title>
</head>
<body>
  <h1>{{title}}</h1>
  <div>{{{content}}}</div>
</body>
</html>

最后,运行导出命令生成静态文件:

node keystone.js export

这将生成静态 HTML 文件并保存在 ./public 目录中。

总结

通过上述步骤,你可以使用 KeystoneJS 创建一个动态网站,并通过导出功能将其转换为静态 HTML 文件。这样,你可以轻松地将生成的静态文件上传到任何静态网站托管服务。

[@russj](/user/russj) 因为 拿不到数据库的信息。只好用这个办法了

关于你的问题,KeystoneJS 是一个基于 Node.js 和 Express 的内容管理系统(CMS),主要用来构建动态的 Web 应用。不过,理论上可以通过一些自定义的方式来实现从动态到静态页面的转换。

动态转静态的基本思路

  1. 生成静态 HTML 文件:使用 KeystoneJS 生成内容,并将其导出为静态 HTML 文件。
  2. 部署静态文件:将生成的静态文件部署到支持静态文件的服务器上(如 GitHub Pages、Netlify 等)。

示例代码

虽然 KeystoneJS 本身没有内置的功能来直接生成静态文件,但你可以通过自定义的路由和中间件来实现这一点。以下是一个简单的示例:

安装必要的依赖

npm install express fs-extra

创建一个简单的脚本生成静态 HTML 文件

const express = require('express');
const fs = require('fs-extra');
const path = require('path');

const app = express();

// 假设 KeystoneJS 已经配置好并连接数据库
const keystone = require('@keystonejs/keystone')({
    adapter: new require('@keystonejs/adapter-mongoose')({
        url: 'mongodb://localhost/your-database-name'
    })
});

app.get('/generate-static', async (req, res) => {
    // 获取所有文章
    const posts = await keystone.list('Post').model.find();

    for (let post of posts) {
        const htmlContent = `
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>${post.title}</title>
            </head>
            <body>
                <h1>${post.title}</h1>
                <div>${post.content}</div>
            </body>
            </html>
        `;

        const filePath = path.join(__dirname, 'public', `${post.slug}.html`);
        await fs.outputFile(filePath, htmlContent);
    }

    res.send('Static files generated successfully!');
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

部署静态文件

生成静态文件后,你可以将这些文件上传到支持静态文件的服务器上,如 Netlify、Vercel 或 GitHub Pages。

总结

以上示例展示了如何通过 KeystoneJS 获取数据并生成静态 HTML 文件。实际应用中,可能需要更复杂的逻辑来处理模板、样式和多语言等需求。希望这能帮助你完成项目!

回到顶部