Hone logo
Hone
Problems

Implementing Static Generation with Vue and TypeScript

Static Site Generation (SSG) is a powerful technique where pages are pre-rendered at build time, resulting in faster load times and improved SEO. This challenge asks you to implement a simple static generation component in Vue using TypeScript, fetching data and rendering it into a static HTML page. This is a fundamental skill for building performant and SEO-friendly Vue applications.

Problem Description

You need to create a Vue component that fetches data from a mock API endpoint and renders it as a static HTML page. The component should utilize Vue's defineAsyncComponent and useFetch composable to fetch the data during the build process. The fetched data should be displayed in a simple HTML structure. The component should be designed to be used within a Vue project configured for static generation.

Key Requirements:

  • Data Fetching: Use useFetch to fetch data from a predefined mock API endpoint.
  • Static Generation: Ensure the component is statically generated during the build process. This means the data fetching should happen at build time, not at runtime.
  • Error Handling: Handle potential errors during data fetching gracefully. Display an error message if the data fails to load.
  • TypeScript: The component must be written in TypeScript, with proper type annotations.
  • Component Structure: The component should render the fetched data in a clear and readable HTML format.

Expected Behavior:

  • During the build process, Vue should fetch the data from the mock API endpoint.
  • The fetched data should be used to generate a static HTML page.
  • When the generated page is served, the data should be already present in the HTML, without any runtime data fetching.
  • If the data fetching fails during the build process, the build should fail with a clear error message.
  • If the data fetching fails at runtime (though this shouldn't happen with SSG), a user-friendly error message should be displayed.

Edge Cases to Consider:

  • API Endpoint Unavailability: What happens if the mock API endpoint is unavailable during the build process?
  • Data Format: Assume the API returns a JSON object with a title and content property. Handle cases where these properties might be missing or invalid.
  • Build Time Errors: Ensure that errors during data fetching are caught and reported during the build process, preventing the generation of incomplete pages.

Examples

Example 1:

Input: API returns: { title: "Welcome!", content: "This is the content of the page." }
Output:  A static HTML page containing: <h1>Welcome!</h1><p>This is the content of the page.</p>
Explanation: The component fetches the data, and the title and content are rendered into the HTML.

Example 2:

Input: API returns: { title: "Error", content: null }
Output: A static HTML page containing: <h1>Error</h1><p>Data could not be loaded.</p>
Explanation: The component handles the null content and displays a default error message.

Example 3: (Edge Case)

Input: API endpoint is unavailable during build.
Output: Build process fails with an error message indicating the API fetch failed.
Explanation: The build process should halt and provide a clear error message, preventing the generation of an incomplete page.

Constraints

  • API Endpoint: Use the following mock API endpoint: https://jsonplaceholder.typicode.com/todos/1 (This endpoint returns a JSON object with userId, id, title, and completed properties. Use the title property for the page title and the completed property for the page content).
  • Vue Version: Vue 3 with TypeScript.
  • Dependencies: You are allowed to use useFetch from @vueuse/core.
  • Performance: The solution should be efficient and avoid unnecessary computations during the build process.
  • Error Handling: Provide meaningful error messages during both build and runtime (though runtime errors should be minimized with SSG).

Notes

  • Remember that static generation happens at build time. Any code that relies on runtime environment variables or user input will not work correctly.
  • Consider using defineAsyncComponent to ensure the component is loaded asynchronously during the build process.
  • Pay close attention to error handling to ensure a robust and reliable build process.
  • The goal is to create a component that can be easily integrated into a Vue project configured for static generation using tools like vite-plugin-vue-ssg. You don't need to configure the entire build process, just the component itself.
Loading editor...
typescript