[技术翻译]使用Nuxt生成静态网站

本周再来翻译一些技术文章,本次预计翻译三篇文章如下:

我翻译的技术文章都放在一个github仓库中,如果觉得有用请点击star收藏。我为什么要创建这个git仓库?目的是通过翻译国外的web相关的技术文章来学习和跟进web发展的新思想和新技术。git仓库地址:https://github.com/yzsunlei/javascript-article-translate

静态网站如今再次流行起来了。信息站和品牌宣传站不再需要使用WordPress之类的内容管理系统来动态更新。

使用静态网站生成器,您可以从无源CMS,API等动态源以及Markdown文件等文件中获取内容。

Nuxt是基于Vue.js的出色的静态网站生成器,可轻松用于构建静态网站。使用Nuxt,从动态内容构建静态网站所需要做的就是创建模板,以从API和Markdown文件等动态源动态显示内容。然后,在Nuxt配置文件中,我们静态定义路由,以便它可以通过相同的路由将内容生成为静态文件。

在本文中,我们将使用Nuxt构建新闻网站,并将使用https://newsapi.org/的News API 作为内容。您必须先了解Vue.js,然后才能使用Nuxt建立网站,因为Nuxt是基于Vue.js的框架。

首先,我们在News API网站上注册API密钥。如果我们只想获取头条新闻,它是免费的。我们开始来使用Nuxt CLI构建网站。我们通过键入以下命令来运行:

npx create-nuxt-app news-website

这将在news-website文件夹中创建初始项目文件。运行该向导时,我们不为服务器端框架选择任何内容,不为UI框架选择任何内容,不为测试框架选择任何内容,不为Nuxt模式选择通用文件,最后根据您的情况选择是否包含Axios请求库,使用lint进行代码整理和prettify进行代码美化。

接下来,我们需要安装一些软件包。我们需要@nuxtjs/dotenv用于在本地读取环境变量的程序包和country-list用于在我们的网站上获取国家列表的库。要安装它们,我们运行:

npm i @nuxtjs/dotenv country-list

现在我们可以开始建立我们的网站了。在default.vue文件中,我们将现有代码替换为:

<template>
  <div>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <nuxt-link class="navbar-brand" to="/">News Website</nuxt-link>
      <button
        class="navbar-toggler"
        type="button"
        data-toggle="collapse"
        data-target="#navbarSupportedContent"
        aria-controls="navbarSupportedContent"
        aria-expanded="false"
        aria-label="Toggle navigation"
      >
        <span class="navbar-toggler-icon"></span>
      </button> <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <nuxt-link class="nav-link" to="/">Home</nuxt-link>
          </li>
          <li class="nav-item dropdown">
            <a
              class="nav-link dropdown-toggle"
              href="#"
              id="navbarDropdown"
              role="button"
              data-toggle="dropdown"
              aria-haspopup="true"
              aria-expanded="false"
            >Headliny by Country</a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <nuxt-link
                class="dropdown-item"
                :to="`/headlines/${c.code}`"
                v-for="(c, i) of countries"
                :key="i"
              >{{c.name}}</nuxt-link>
            </div>
          </li>
        </ul>
      </div>
    </nav>
    <nuxt />
  </div>
</template>

<script>
import { requestsMixin } from "~/mixins/requestsMixin";
const { getData } = require("country-list");

export default {
  mixins: [requestsMixin],
  data() {
    return {
      countries: getData()
    };
  }
};
</script>

<style>
.bg-light {
  background-color: lightcoral !important;
}
</style>

这是用于定义我们网站布局的文件。我们在此处添加了Bootstrap导航栏。该栏包含主页链接和国家列表的下拉列表。这些nuxt-link组件都是指向页面的链接,这些页面用于在生成静态文件时获取国家/地区的标题。可以通过调用函数从该部分的country-list包中获取国家。在本节中,我们通过覆盖类的默认颜色来更改导航栏的背景颜色。本部分底部的组件将显示我们的内容。

scriptgetDatastyle.bg-lightnuxttemplate

接下来,我们创建一个mixins文件夹并创建一个名为requestsMixin.jsfile的文件。在其中,我们添加:

const APIURL = "https://newsapi.org/v2";
const axios = require("axios");
export const requestsMixin = {
  methods: {
    getHeadlines(country) {
      return axios.get(
        `${APIURL}/top-headlines?country=${country}&apiKey=${process.env.VUE_APP_APIKEY}`
      );
    }, getEverything(keyword) {
      return axios.get(
        `${APIURL}/everything?q=${keyword}&apiKey=${process.env.VUE_APP_APIKEY}`
      );
    }
  }
};

该文件包含用于从News API获取按国家/地区和关键字作为标题的代码。

然后,在pages文件夹中,我们创建headlines文件夹,然后在文件headlines夹中,创建_countryCode.vue文件。在文件中,我们添加:

<template>
  <div class="container">
    <h1 class="text-center">Headlines in {{getCountryName()}}</h1>
    <div v-if="headlines.length > 0">
      <div class="card" v-for="(h, i) of headlines" :key="i">
        <div class="card-body">
          <h5 class="card-title">{{h.title}}</h5>
          <p class="card-text">{{h.content}}</p>
          <button class="btn btn-primary" :href="h.url" target="_blank" variant="primary">Read</button>
        </div>
        <img :src="h.urlToImage" class="card-img-bottom" />
      </div>
    </div>
    <div v-else>
      <h2 class="text-center">No headlines found.</h2>
    </div>
  </div>
</template>

<script>
import { requestsMixin } from "~/mixins/requestsMixin";
const { getData } = require("country-list");

export default {
  mixins: [requestsMixin],
  data() {
    return {
      headlines: [],
      countries: getData()
    };
  },
  beforeMount() {
    this.getHeadlinesByCountry();
  },
  methods: {
    async getHeadlinesByCountry() {
      this.country = this.$route.params.countryCode;
      const { data } = await this.getHeadlines(this.country);
      this.headlines = data.articles;
    }, 

    getCountryName() {
      const country = this.countries.find(
        c => c.code == this.$route.params.countryCode
      );
      return country ? country.name : "";
    }
  }
};
</script>

在该文件中,我们接受route参数,countryCode然后从该位置调用我们之前制作并包含在此组件中的this.getHeadlines函数,requestsMixin以从News API获取标题。然后结果将显示在该template部分的Bootstrap卡中。在模板中,我们通过从country-list数据中找到国家名称来获得国家名称。如果找不到标题,我们会显示一条消息。通常,如果要制作一个接受URL参数的页面,则必须制作一个带有下划线作为第一个字符以及所需URL参数的变量名的文件。因此,在此示例中,_countryCode.vue中我们将countryCode使用该参数this.$route.params.countryCode

接下来,index.vue在pages文件夹中,将现有代码替换为:

<template>
  <div class="container">
    <h1 class="text-center">Home</h1>
    <div class="card" v-for="(h, i) of headlines" :key="i">
      <div class="card-body">
        <h5 class="card-title">{{h.title}}</h5>
        <p class="card-text">{{h.content}}</p>
        <button class="btn btn-primary" :href="h.url" target="_blank" variant="primary">Read</button>
      </div>
      <img :src="h.urlToImage" class="card-img-bottom" />
    </div>
  </div>
</template>
<script>
import { requestsMixin } from "~/mixins/requestsMixin";
const { getData } = require("country-list");

export default {
  mixins: [requestsMixin],
  data() {
    return {
      headlines: []
    };
  },
  beforeMount() {
    this.getHeadlinesByCountry();
  },
  methods: {
    async getHeadlinesByCountry() {
      const { data } = await this.getHeadlines("us");
      this.headlines = data.articles;
    }
  }
};
</script>

<style>
</style>

这使我们可以在主页上显示美国的标题。它的工作原理与_countryCode.vue页面相似,不同之处在于,我们仅获得美国的头条新闻,而不接受URL参数来根据URL获得来自不同国家/地区的头条新闻。

接下来,我们create-env.js在项目的根文件夹中创建一个,并添加以下内容:

const fs = require('fs')
fs.writeFileSync('./.env', `API_KEY=${process.env.API_KEY}`)

这使我们可以部署到Netlify,因为我们需要.env根据输入的环境变量动态创建文件。另外,我们.env手动创建文件,然后将API_KEY键作为键,将News API API键作为值。

接下来的nuxt.config.js,我们将现有代码替换为:

require("dotenv").config();
const { getData } = require("country-list");

export default {
  mode: "universal",
  /*
   ** Headers of the page
   */
  head: {
    title: "News Website",
    meta: [
      { charset: "utf-8" },
      { name: "viewport", content: "width=device-width, initial-scale=1" },
      {
        hid: "description",
        name: "description",
        content: process.env.npm_package_description || ""
      }
    ],
    link: [
      { rel: "icon", type: "image/x-icon", href: "/favicon.ico" },
      {
        rel: "stylesheet",
        href:
         "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
      }
    ],
    script: [
      { src: "https://code.jquery.com/jquery-3.3.1.slim.min.js" },
      {
        src:
          "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
      },
      {
        src:
          "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
      }
    ]
  },
  /*
   ** Customize the progress-bar color
   */
  loading: { color: "#fff" },
  /*
   ** Global CSS
   */
  css: [],
  /*
   ** Plugins to load before mounting the App
   */
  plugins: [],
  /*
   ** Nuxt.js dev-modules
   */
  buildModules: [],
  /*
   ** Nuxt.js modules
   */
  modules: [
    // Doc: https://axios.nuxtjs.org/usage
    "@nuxtjs/axios",
    "@nuxtjs/dotenv"
  ],
  /*
   ** Axios module configuration
   ** See https://axios.nuxtjs.org/options
   */
  axios: {},
  /*
   ** Build configuration
   */
  build: {
    /*
     ** You can extend webpack config here
     */
    extend(config, ctx) {}
  },
  env: {
    apiKey: process.env.API_KEY || ""
  },
  router: {
    routes: [
      {
        name: "index",
        path: "/",
        component: "pages/index.vue"
      },
      {
        name: "headlines-id",
        path: "/headlines/:countryCode?",
        component: "pages/headlines/_countryCode.vue"
      }
    ]
  },
  generate: {
    routes() {
      return getData().map(d => `headlines/${d.code}`);
    }
  }
};

在head对象中,我们更改了title以便显示所需的标题而不是默认标题。在link中,我们添加了Bootstrap CSS,在script中,我们添加了Bootstrap JavaScript文件和jQuery,它们是Bootstrap的依赖项。由于我们要构建静态站点,因此不能使用BootstrapVue,因为它是动态的。我们不希望在生成的输出中使用任何动态JavaScript,因此我们必须使用普通的Bootstrap。在modules中,我们添加"@nuxtjs/dotenv"了从.env创建到Nuxt应用程序的文件中读取环境变量的功能。我们还进行了添加,require("dotenv").config();以便我们可以将process.env.API_KEY其添加到此配置文件中。我们必须这样做,所以我们不必检入.env文件。在里面env部分,我们有了apiKey: process.env.API_KEY || "",这是通过使用读取.env文件中的API KEY而获得的dotenv。

在router中,我们定义了动态路由,以便当用户单击具有给定URL的链接或单击具有此类URL的链接时可以查看它们。Nuxt还使用这些路由来生成静态文件。在generate中,我们定义了Nuxt遍历的路径,以生成静态网站的静态文件。在这种情况下,路由数组由我们之前创建的标题页面的路由组成。它将遍历它们以获取它们的数据,然后渲染它们并从渲染的结果生成文件。文件夹结构将与路线相对应。因此,由于我们path是/headlines/:countryCode,因此生成的工件将具有该headlines文件夹以及所有国家/地区代码作为子文件夹的名称,并且在每个文件夹内将有一个index.html 与呈现的内容。

现在,我们准备将我们的网站部署到Netlify。通过转到https://www.netlify.com/创建一个Netlify帐户。免费计划将满足我们的需求。然后将代码提交到托管在GitHub,Gitlab或Bitbucket上的Git存储库。然后,当您登录Netlify时,单击Git中的New site。从那里,您可以添加托管在其中一项服务中的Git存储库。然后,当要求您输入Build Command时,输入node ./create-env.js && npm run generate,发布目录将为dist。

之后,将.env文件中的API密钥输入到网站设置的“环境变量”部分,您可以通过单击“构建和部署”菜单上的“环境”链接来进入。输入API_KEY作为密钥,然后输入News API API密钥作为值。然后单击保存按钮。

一旦将所有内容提交并推送到由GitHub,Gitlab或Bitbucket托管的Git存储库中,Netlify将自动构建和部署。

原文链接:https://dev.to/aumayeung/generate-static-websites-with-nuxt-1ia1

原文地址:https://www.cnblogs.com/yzsunlei/p/12159076.html

时间: 2024-08-26 06:14:02

[技术翻译]使用Nuxt生成静态网站的相关文章

工具:使用jetty生成静态网站

在使用前端框架构建网页而不使用后端平台与数据库,即没有服务器的条件下读取文件夹其他文件,浏览器可能会阻止访问.对于这种静态构建可以使用简单的生成工具jekyll.它主要适用于将静态文件生成静态网站,在github pages上非常常用. 介绍:jekyll 注意,在新版本上使用时可能会出现“cannot load such files ”的问题,可以改用旧的版本,或使用此解决方案:way

[技术翻译]Web网页内容是如何影响电池使用寿命的?

本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响电池功耗的(How Web Content Can Affect Power Usage) 06.[译]在现代JavaScript中编写异步任务(https://web.dev/off-main-thread/) 我翻译的技术文章都放在一个github仓库中,如果觉得有用请点击star收藏.我为什么

静态网站及其生成、托管会成为一种流行趋势吗?

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这个问题是我最近工作中,一直在思考的内容,今天和大家分享和讨论一下我的看法. 定义 静态网站:整个网站只由静态的内容(HTML\CSS\JS\Images-)组成,服务端发送给客户端的都是直接的内容,而不是通过动态网页技术(不管是ASP\JSP\PHP\Django\RoR\NodeJS)在收到请求的时候由服务端进行渲染出最终HTML发送给客户端. 静态网站生成器:基于动态内容生成静态网站的技

生成静态页技术

概要: 1.什么是生成静态页技术? 答:互联网上流行的做法是将数据源代码写入数据库再从数据库读取生成静态面,这样无形间就加大了数据库.将现有的ASP页直接生成静态页,将会节省很多. 2.为什么要生成静态页以及好处? 答:一.加快页面打开浏览速度,静态页面无需连接数据库打开速度较动态页面有明 显提高: 二.有利于搜索引擎优化SEO,Baidu.Google都会优先收录静态页面,不仅被收录的快还收录的全: 三.减轻服务器负担,浏览网页无需调用系统数据库: 四.网站更安全,HTML页面不会受Asp相关

Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(一)--技术流ken

前言 在之前已经写了关于Git,Gitlab以及Ansible的两篇博客<Git+Gitlab+Ansible剧本实现一键部署Nginx--技术流ken>,<Git+Gitlab+Ansible剧本实现一键部署动态网站(二)--技术流ken>,以及关于jenkins的简单使用<Jenkins持续集成介绍及插件安装版本更新演示(一)--技术流ken>.相信大家也已经完全掌握了这三项工具的使用,也可以使用这几项工具可以部署静态以及动态网站了. 以前的博客可以实现一键部署网站

PHP代码为什么不能直接保存HTML文件——&gt;PHP生成静态页面教程

1.服务器会根据文件的后缀名去进行解析,如果是HTML文件则服务器不会进行语法解析,而是直接输出到浏览器. 2.如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件,这样反而会降低运行效率. 3.如果是需要PHP控制HTML代码的输出,比如需要PHP判断用户是否登陆,如果登陆则输出A,未登录则输出B.这就需要PHP来进行控制了.HTML不能实现这样的功能 PHP生成静态页面教程 ,一些基本的概念 一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可

比较详细PHP生成静态页面教程

一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对 脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器.由此不难看出,在页面发送到浏览器后,P

.net快速生成静态网页的方法一

一般用.net生成静态化网页方法有两种,一般是通过浏览器去触发动态的.aspx文件来达到解析网页,然后再生成网页,这种方法我们不用(因为这种方法需要浪费比较大的服务器性能,而且速度比较慢,一秒大概只能生成10个网页左右),所以我们今天要讲的是第二种方法,写一个网页模板,然后再用.net去解析标签,然后以完成这一个生成网页静态化功能(独占网络(http://www.sz886.com)-深圳网站建设-http://www.sz886.com技术人员测试过1秒可以生成100多个网页,性能非常好而且稳

浅谈php生成静态页面

一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权限限制等,但是,对应一些我们经常频频使用的文件,比方说,开发的新闻发布系统,我们不希望很多用户都读取数据库才显示结果,这样一方面消耗了服务器的资源,另一方面占去了浏览者大量可贵的响应时间,所有,有了"静态页面话"的做法,当前很多网站都采用这种技术,一般都是由管理后台控制,或者生成html直