初始化 demo 项目
npm init vue@latest
这个命令的意思是:npm init 使用 vite3 工具进行 vue 项目构建。
执行命令后会询问是否需要安装依赖,对于新手来说,按回车跳过即可,以后用到的时候再安装。
因为 Vue3 官方文档 对于 JavaScript 基础薄弱的初学者来说,显得过于深奥了,对于没有用过 vue cli 构建工程的人来说也很难懂,下面从初始化 demo 项目后,说一说新手需要关心的文件及内容:
目录 | 说明 |
---|---|
package.json | 项目运行环境信息 |
package-lock.json | 依赖模块的信息 |
vite.config.js | vite 的 web 服务配置 |
index.html | 首页,与 src/main.js 产生关联 |
src/main.js | 应用程序入口文件,与 src/App.vue 产生关联 |
src/App.vue | 应用的根组件,与 components/HellowWorld.vue 和 components/WelComeItem.vue 产生关联 |
components/HellowWorld.vue | 子组件 HellowWorld |
components/WelComeItem.vue | 子组件 WelComeItem,与 components/TheWelcome.vue 和 其他资源产生关联 |
components/TheWelcome.vue | 子组件 TheWelcome |
components/icons/*.vue | 图标组件代码 |
assets/* | 公共 CSS 样式代码 |
public/* | 公共资源目录 |
package.json
项目运行环境信息,执行 npm run cmd --args
用到
{
// 项目信息
"name": "mydemo",
"version": "0.0.0",
"private": true,
// scripts 的 keys 是 npm run cmd 中的 cmd,
// 例如 npm run build 等同于 npm run vite build
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
// 依赖的 vue 版本
"dependencies": {
"vue": "^3.2.45"
},
// 开发环境依赖的 vite 版本
"devDependencies": {
"@vitejs/plugin-vue": "^4.0.0",
"vite": "^4.0.0"
}
package-lock.json
所有依赖模块的信息,执行模块安装命令 npm install
时自动生成,删掉不影响运行
vite.config.js
vite 的 web 服务运行配置
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/ ,建议切到中文版进行学习
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
})
删除这个文件后,vite 可以正常启动,但是访问 url 会报错:
Failed to parse source for import analysis because the content contains invalid JS syntax.
index.html
首页,引用 src/main.js 文件,使得 index.html 与 vue 产生关联
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<!-- 定义一个 id 为 app 的组件 -->
<div id="app"></div>
<!-- 引用 js 文件,使得 index.html 与 vue 产生关联 -->
<script type="module" src="/src/main.js"></script>
</body>
</html>
src/main.js
应用程序入口文件
// 导入 vue 框架中的 createApp 方法
import { createApp } from 'vue'
// 导入用户自定义的根组件
import App from './App.vue'
// 导入 css 样式文件,全局生效
import './assets/main.css'
// 挂载根组件,并渲染到 index.html 中 id 为 app 的 HTML 标签中
createApp(App).mount('#app')
src/App.vue
用户应用的根组件,看注释就好,代码可以先不看
<script setup>
<!-- 导入子组件 -->
import HelloWorld from './components/HelloWorld.vue'
import TheWelcome from './components/TheWelcome.vue'
</script>
<!-- 将 id 为 app 的 div 标签替换为以下 HTML 内容 -->
<template>
<header>
<img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" />
<div class="wrapper">
<!-- 使用 HelloWorld 组件,这个组件有个参数叫 args -->
<HelloWorld msg="You did it!" />
</div>
</header>
<main>
<!-- 使用 TheWelcome 组件 -->
<TheWelcome />
</main>
</template>
<!-- 只对本组件生效的 CSS 样式 -->
<style scoped>
header {
line-height: 1.5;
}
.logo {
display: block;
margin: 0 auto 2rem;
}
@media (min-width: 1024px) {
header {
display: flex;
place-items: center;
padding-right: calc(var(--section-gap) / 2);
}
.logo {
margin: 0 2rem 0 0;
}
header .wrapper {
display: flex;
place-items: flex-start;
flex-wrap: wrap;
}
}
</style>
components/HellowWorld.vue
子组件 HellowWorld,看注释就好,代码可以先不看
<script setup>
// 定义组件的参数:msg,数据类型为 String,使用此组件时必须提供 msg 参数的内容
defineProps({
msg: {
type: String,
required: true
}
})
</script>
<!-- 此组件的 HTML 内容 -->
<template>
<div class="greetings">
<h1 class="green">{{ msg }}</h1>
<h3>
You’ve successfully created a project with
<a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
</h3>
</div>
</template>
<!-- 仅对此组件生效的的 CSS 样式 -->
<style scoped>
h1 {
font-weight: 500;
font-size: 2.6rem;
top: -10px;
}
h3 {
font-size: 1.2rem;
}
.greetings h1,
.greetings h3 {
text-align: center;
}
@media (min-width: 1024px) {
.greetings h1,
.greetings h3 {
text-align: left;
}
}
</style>
src/TheWelcome.vue
子组件 TheWelcome,看注释就好,代码可以先不看
<script setup>
// 引入 WelComeItem 组件和图标组件 icons/*.vue
import WelcomeItem from './WelcomeItem.vue'
import DocumentationIcon from './icons/IconDocumentation.vue'
import ToolingIcon from './icons/IconTooling.vue'
import EcosystemIcon from './icons/IconEcosystem.vue'
import CommunityIcon from './icons/IconCommunity.vue'
import SupportIcon from './icons/IconSupport.vue'
</script>
<!-- 本组件的 HTML 内容 -->
<template>
<!-- 使用 WelComeItem 组件 -->
<WelcomeItem>
<template #icon>
<DocumentationIcon />
</template>
<template #heading>Documentation</template>
Vue’s
<a href="https://vuejs.org/" target="_blank" rel="noopener">official documentation</a>
provides you with all information you need to get started.
</WelcomeItem>
<!-- 使用 WelComeItem 组件 -->
<WelcomeItem>
<template #icon>
<ToolingIcon />
</template>
<template #heading>Tooling</template>
This project is served and bundled with
<a href="https://vitejs.dev/guide/features.html" target="_blank" rel="noopener">Vite</a>. The
recommended IDE setup is
<a href="https://code.visualstudio.com/" target="_blank" rel="noopener">VSCode</a> +
<a href="https://github.com/johnsoncodehk/volar" target="_blank" rel="noopener">Volar</a>. If
you need to test your components and web pages, check out
<a href="https://www.cypress.io/" target="_blank" rel="noopener">Cypress</a> and
<a href="https://on.cypress.io/component" target="_blank">Cypress Component Testing</a>.
<br />
More instructions are available in <code>README.md</code>.
</WelcomeItem>
<!-- 使用 WelComeItem 组件 -->
<WelcomeItem>
<template #icon>
<EcosystemIcon />
</template>
<template #heading>Ecosystem</template>
Get official tools and libraries for your project:
<a href="https://pinia.vuejs.org/" target="_blank" rel="noopener">Pinia</a>,
<a href="https://router.vuejs.org/" target="_blank" rel="noopener">Vue Router</a>,
<a href="https://test-utils.vuejs.org/" target="_blank" rel="noopener">Vue Test Utils</a>, and
<a href="https://github.com/vuejs/devtools" target="_blank" rel="noopener">Vue Dev Tools</a>. If
you need more resources, we suggest paying
<a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">Awesome Vue</a>
a visit.
</WelcomeItem>
<!-- 使用 WelComeItem 组件 -->
<WelcomeItem>
<template #icon>
<CommunityIcon />
</template>
<template #heading>Community</template>
Got stuck? Ask your question on
<a href="https://chat.vuejs.org" target="_blank" rel="noopener">Vue Land</a>, our official
Discord server, or
<a href="https://stackoverflow.com/questions/tagged/vue.js" target="_blank" rel="noopener"
>StackOverflow</a
>. You should also subscribe to
<a href="https://news.vuejs.org" target="_blank" rel="noopener">our mailing list</a> and follow
the official
<a href="https://twitter.com/vuejs" target="_blank" rel="noopener">@vuejs</a>
twitter account for latest news in the Vue world.
</WelcomeItem>
<!-- 使用 WelComeItem 组件 -->
<WelcomeItem>
<template #icon>
<SupportIcon />
</template>
<template #heading>Support Vue</template>
As an independent project, Vue relies on community backing for its sustainability. You can help
us by
<a href="https://vuejs.org/sponsor/" target="_blank" rel="noopener">becoming a sponsor</a>.
</WelcomeItem>
</template>
components/WelComeItem.vue
子组件 WelComeItem,看注释就好,代码可以先不看
<!-- 这个组件没有 script 代码 -->
<template>
<div class="item">
<i>
<slot name="icon"></slot>
</i>
<div class="details">
<h3>
<slot name="heading"></slot>
</h3>
<slot></slot>
</div>
</div>
</template>
<style scoped>
.item {
margin-top: 2rem;
display: flex;
}
.details {
flex: 1;
margin-left: 1rem;
}
i {
display: flex;
place-items: center;
place-content: center;
width: 32px;
height: 32px;
color: var(--color-text);
}
h3 {
font-size: 1.2rem;
font-weight: 500;
margin-bottom: 0.4rem;
color: var(--color-heading);
}
@media (min-width: 1024px) {
.item {
margin-top: 0;
padding: 0.4rem 0 1rem calc(var(--section-gap) / 2);
}
i {
top: calc(50% - 25px);
left: -26px;
position: absolute;
border: 1px solid var(--color-border);
background: var(--color-background);
border-radius: 8px;
width: 50px;
height: 50px;
}
.item:before {
content: ' ';
border-left: 1px solid var(--color-border);
position: absolute;
left: 0;
bottom: calc(50% + 25px);
height: calc(50% - 25px);
}
.item:after {
content: ' ';
border-left: 1px solid var(--color-border);
position: absolute;
left: 0;
top: calc(50% + 25px);
height: calc(50% - 25px);
}
.item:first-of-type:before {
display: none;
}
.item:last-of-type:after {
display: none;
}
}
</style>
其他资源
其他文件就不一一细说了
小结
总结一下,学习 demo 项目的路径是:
- index.html
- src/main.js
- src/App.vue
- components/*.vue
- components/icons/*.vue
- 其他