From 49bcc254dc0730899306b83e373d6ae72eba0f13 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 2 Mar 2023 18:35:28 +0800 Subject: [PATCH] docs: rewrite getting started + init tips --- docs/.vitepress/config.ts | 3 +- docs/guide/getting-started.md | 167 +++++++++++++++------------------- docs/guide/routing.md | 8 +- docs/guide/vitepress-init.png | Bin 0 -> 18010 bytes docs/reference/cli.md | 1 + src/node/init/init.ts | 45 ++++++--- 6 files changed, 113 insertions(+), 111 deletions(-) create mode 100644 docs/guide/vitepress-init.png create mode 100644 docs/reference/cli.md diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index ff598e8e91ed..9b93db80df8e 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -147,7 +147,8 @@ function sidebarReference() { link: '/reference/default-theme-config' }, { text: 'Frontmatter Config', link: '/reference/frontmatter-config' }, - { text: 'Runtime API', link: '/reference/runtime-api' } + { text: 'Runtime API', link: '/reference/runtime-api' }, + { text: 'CLI', link: '/reference/cli' } ] } ] diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 325f6e3fd734..90a3594e6ee3 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -1,63 +1,31 @@ # Getting Started -This section will help you build a basic VitePress documentation site from ground up. If you already have an existing project and would like to keep documentation inside the project, start from Step 2. +## Prerequisites -You can also try VitePress online on [StackBlitz](https://vitepress.new/). It runs the VitePress-based site directly in the browser, so it is almost identical to the local setup but doesn't require installing anything on your machine. +VitePress requires [Node.js](https://nodejs.org/) version 16 or higher. -::: warning -VitePress is currently in `alpha` status. It is already suitable for out-of-the-box documentation use, but the config and theming API may still change between minor releases. -::: - -## Step 1: Create a new project - -Create and change into a new directory. - -```sh -$ mkdir vitepress-starter && cd vitepress-starter -``` +## Installation -Then, initialize with your preferred package manager. +VitePress can be used on its own, or be installed into an existing project. Either way, you can install it with: ::: code-group ```sh [npm] -$ npm init -``` - -```sh [yarn] -$ yarn init +$ npm install -D vitepress ``` ```sh [pnpm] -$ pnpm init -``` - -::: - -## Step 2: Install VitePress - -Add VitePress and Vue as dev dependencies for the project. - -::: code-group - -```sh [npm] -$ npm install -D vitepress vue +$ pnpm add -D vitepress ``` ```sh [yarn] -$ yarn add -D vitepress vue -``` - -```sh [pnpm] -$ pnpm add -D vitepress vue +$ yarn add -D vitepress ``` ::: ::: details Getting missing peer deps warnings? -`@docsearch/js` has certain issues with its peer dependencies. If you see some commands failing due to them, you can try this workaround for now: - -If using PNPM, add this in your `package.json`: +If using PNPM, you will notice a missing peer warning for `@docsearch/js`. This does not prevent VitePress from working. If you wish to suppress this warning, add the following to your `package.json`: ```json "pnpm": { @@ -71,15 +39,69 @@ If using PNPM, add this in your `package.json`: ::: -Create your first document. +## Setup Wizard + +VitePress ships with a command line setup wizard that will help you scaffold a basic project. Start the wizard by running: ```sh -$ mkdir docs && echo '# Hello VitePress' > docs/index.md +$ npx vitepress init ``` -## Step 3: Boot up dev environment +You should be greeted with the following: + +

+ vitepress init screenshot +

+ +If you are installing VitePress in an existing project alongside the source code, it is recommended to scaffold the site in a nested directory so that it is separate from the rest of the project. + +## File Structure + +Assuming you chose to scaffold the VitePress project in `./docs`, the generated file structure should look like this: -Add some scripts to `package.json`. +``` +. +├─ docs +│ ├─ .vitepress +│ │ └─ config.js +│ ├─ api-examples.md +│ ├─ markdown-examples.md +│ └─ index.md +└─ package.json +``` + +The `docs` directory is considered the **project root** of the VitePress site. The `.vitepress` directory contains the config file, dev server cache, build output, and optional theme customization code. + +### The Config File + +The config file allows you to customize various aspects of your VitePress site, with the most basic options being the title and description of the site: + +```js +// .vitepress/config.js +export default { + // site-level options + title: 'VitePress', + description: 'Just playing around.', + + themeConfig: { + // theme-level options + } +} +``` + +You can also configure the behavior of the theme via the `themeConfig` option. Consult the [Site Config Reference](/reference/site-config) for full details on all config options. + +### Source Files + +Markdown files outside the `.vitepress` directory are considered **source files**. + +VitePress uses **file-based routing**: each `.md` file is compiled into a corresponding `.html` file with the same path. For example, `index.md` will be compiled into `index.html`, and can be visited at the root path `/` of the resulting VitePress site. + +We will discuss more about [Routing](./routing) in the next chapter. + +## Up and Running + +The tool should have also injected the following npm scripts to your `package.json` if you allowed it to do so during the setup process: ```json { @@ -93,7 +115,7 @@ Add some scripts to `package.json`. } ``` -Serve the documentation site in the local server. +The `docs:dev` script will start a local dev server with instant hot updates. Run it with the following command: ::: code-group @@ -110,58 +132,17 @@ $ pnpm run docs:dev ``` ::: -VitePress will start a hot-reloading development server at `http://localhost:5173`. - -## Step 4: Add more pages - -Let's add another page to the site. Create a file name `getting-started.md` along with `index.md` you've created in Step 2. Now your directory structure should look like this. - -``` -. -├─ docs -│ ├─ getting-started.md -│ └─ index.md -└─ package.json -``` - -Then, try to access `http://localhost:5173/getting-started.html` and you should see the content of `getting-started.md` is shown. - -This is how VitePress works basically. The directory structure corresponds with the URL path. You add files, and just try to access it. - -## Configuration - -Without any configuration, the page is pretty minimal, and the user has no way to navigate around the site. To customize your site, let's first create a `.vitepress` directory inside your docs directory. This is where all VitePress-specific files will be placed. Your project structure is probably like this: - -``` -. -├─ docs -│ ├─ .vitepress -│ │ └─ config.js -│ └─ index.md -└─ package.json -``` - -The essential file for configuring a VitePress site is `.vitepress/config.js`, which should export a JavaScript object: - -```js -export default { - title: 'VitePress', - description: 'Just playing around.' -} -``` - -In the above example, the site will have the title of `VitePress`, and `Just playing around.` as the description meta tag. -Learn everything about VitePress features at [Theme: Introduction](./custom-theme) to find how to configure specific features within this config file. +The dev server should be running at `http://localhost:5173`. Visit the URL in your browser to see your new site in action! -You may also find all configuration references at [Config Reference](/reference/site-config). +## What's Next? -## What's next? +- To better understand how markdown files are mapped to generated HTML, proceed to the [Routing Guide](./routing.md). -By now, you should have a basic but functional VitePress documentation site. But currently, the user has no way to navigate around the site because it's missing for example sidebar menu we have on this site. +- To discover more about what you can do on the page, such as writing markdown content or using Vue Component, refer to the "Writing" section of the guide. A great place to start would be to learn about [Markdown Extensions](/guide/markdown). -If you would like to know more about what you can do within the page, for example, writing markdown contents, or using Vue Component, check out the "Writing" section of the docs. [Markdown guide](./markdown) would be a great starting point. +- To explore the features provided by the default documentation theme, check out the [Default Theme Config Reference](/reference/default-theme-config). -If you want to know how to customize how the site looks (Theme), and find out the features VitePress's default theme provides, check out how to [extend the default theme](./extending-default-theme) or [build a custom theme](./custom-theme). +- If you want to further customize the appearance of your site, explore how to either [Extend the Default Theme](./extending-default-theme) or [Build a Custom Theme](./custom-theme). -When your documentation site starts to take shape, be sure to read the [deployment guide](./deploy). +- Once your documentation site takes shape, make sure to read the [Deployment Guide](./deploy). diff --git a/docs/guide/routing.md b/docs/guide/routing.md index 6df8799fe9ad..d82a7cd48ca0 100644 --- a/docs/guide/routing.md +++ b/docs/guide/routing.md @@ -18,10 +18,10 @@ By default, VitePress assumes your page files are stored in project root. Here y Then you can access the pages by the below URL. ``` -index.md -> / -prologue.md -> /prologue.html -guide/index.md -> /guide/ -guide/getting-started.md -> /guide/getting-started.html +index.md --> / +prologue.md --> /prologue.html +guide/index.md --> /guide/ +guide/getting-started.md --> /guide/getting-started.html ``` As you can see, the directory structure corresponds to the final URL, as same as hosting plain HTML from a typical web server. diff --git a/docs/guide/vitepress-init.png b/docs/guide/vitepress-init.png new file mode 100644 index 0000000000000000000000000000000000000000..d1805cf7a50b3d641c4cf7932377abb40364d8d1 GIT binary patch literal 18010 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 z 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 aWC015%Z0^KEpGCPAW=_OKbLh*2~7a