本文全面介绍了如何进行vue CLI学习,涵盖了Vue CLI的安装、配置以及项目创建等关键步骤。文章详细讲解了Vue CLI的各种功能和优势,如快速搭建项目、热重载、代码分割等,并提供了丰富的实践案例和常见问题解决方案。通过本文的学习,读者可以全面掌握vue CLI学习的相关知识。
Vue CLI简介Vue CLI 是 Vue.js 官方的脚手架工具,它可以帮助开发者快速搭建 Vue.js 项目。Vue CLI 提供了许多开箱即用的功能,例如项目构建、代码分割、路由配置、资源打包等,可以显著提高开发效率。
在使用 Vue CLI 之前,需要先安装 Node.js 和 npm。
node -v npm -v
使用 npm 全局安装 Vue CLI:
npm install -g @vue/cli
安装完成后,可以通过以下命令检查 Vue CLI 是否安装成功:
vue --version使用Vue CLI创建项目
使用 Vue CLI 创建新项目的命令如下:
vue create my-project
其中,my-project
是项目的名称,可以自行定义。
创建项目后,打开项目文件夹,可以看到以下文件结构:
my-project/ ├── node_modules/ ├── public/ │ ├── index.html ├── src/ │ ├── assets/ │ ├── components/ │ ├── App.vue │ ├── main.js ├── .gitignore ├── babel.config.js ├── package.json └── vue.config.js
node_modules
:存放项目依赖的库文件。public
:存放静态文件,如 index.html
。src
:存放项目的主要文件,包括组件、样式、路由等。.gitignore
:配置文件,定义哪些文件或目录不需要被 Git 版本控制系统跟踪。babel.config.js
:配置 Babel,用于将 ES6+ 代码转换为兼容的 JavaScript 代码。package.json
:包含项目的元数据以及依赖信息。vue.config.js
:配置 Vue CLI 的构建选项。App.vue
:项目的入口文件,定义了应用的根组件。main.js
:项目的入口文件,用于挂载 Vue 实例。创建项目后,打开项目文件夹,可以看到以下文件结构:
my-project/ ├── node_modules/ ├── public/ │ ├── index.html ├── src/ │ ├── assets/ │ ├── components/ │ ├── App.vue │ ├── main.js ├── .gitignore ├── babel.config.js ├── package.json └── vue.config.js
node_modules
:存放项目依赖的库文件。public
:存放静态文件,如 index.html
。src
:存放项目的主要文件,包括组件、样式、路由等。.gitignore
:配置文件,定义哪些文件或目录不需要被 Git 版本控制系统跟踪。babel.config.js
:配置 Babel,用于将 ES6+ 代码转换为兼容的 JavaScript 代码。package.json
:包含项目的元数据以及依赖信息。vue.config.js
:配置 Vue CLI 的构建选项。App.vue
:项目的入口文件,定义了应用的根组件。main.js
:项目的入口文件,用于挂载 Vue 实例。Vue CLI 默认使用 vue-router
进行路由配置。假设项目中需要配置两个路由:Home
和 About
。
src
目录下创建一个 router
文件夹,并在其中创建一个 index.js
文件。index.js
文件中,配置路由:import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' import About from '../views/About.vue' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
main.js
中引入并使用路由:import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false new Vue({ router, render: h => h(App) }).$mount('#app')
Vue CLI 提供了丰富的资源打包配置选项,例如配置构建工具、资源文件打包等。以下是一些常见配置:
默认情况下,Vue CLI 使用 Webpack 作为构建工具。可以通过 vue.config.js
文件进行配置。
vue.config.js
文件。module.exports = { configureWebpack: { resolve: { alias: { '@': '/src' } } } }
Vue CLI 支持多种资源文件的打包,例如图片、样式文件等。可以通过 vue.config.js
文件进行配置。
module.exports = { chainWebpack: config => { config.module .rule('images') .use('url-loader') .loader('url-loader') .tap(options => { return { ...options, limit: 8192, name: 'img/[name].[hash:8].[ext]' } }) } }
module.exports = { css: { extract: true, sourceMap: false, loaderOptions: { sass: { additionalData: '@import "@/styles/global.scss";' } } } }常用命令和插件
Vue CLI 提供了一些常用的开发命令,以下是一些常用的命令:
npm run serve
npm run build
dist
文件夹下的文件开启静态资源服务:npm run start
npm run test:unit
npm run lint
Vue CLI 支持安装各种插件来扩展功能,例如 vue-cli-plugin-vuetify
用于引入 Vuetify 库。
vue add vuetify
在 main.js
中使用插件:
import Vue from 'vue' import App from './App.vue' import vuetify from './plugins/vuetify' Vue.config.productionTip = false new Vue({ vuetify, render: h => h(App) }).$mount('#app')实践案例
假设开发一个简单的博客应用,包含文章列表和文章详情两个页面。
vue create blog-app
src/router/index.js
中配置路由:import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' import Article from '../views/Article.vue' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/article/:id', name: 'Article', component: Article } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
Home.vue
:<template> <div> <h1>文章列表</h1> <ul> <li v-for="article in articles" :key="article.id" @click="navigateToArticle(article.id)"> {{ article.title }} </li> </ul> </div> </template> <script> export default { data() { return { articles: [ { id: 1, title: '文章一' }, { id: 2, title: '文章二' }, { id: 3, title: '文章三' } ] } }, methods: { navigateToArticle(id) { this.$router.push({ name: 'Article', params: { id } }) } } } </script> <style scoped> .container { padding: 10px; background-color: #f0f0f0; } </style>
Article.vue
:<template> <div> <h1>{{ article.title }}</h1> <p>{{ article.content }}</p> </div> </template> <script> export default { data() { return { article: {} } }, created() { const id = this.$route.params.id this.article = this.getArticleById(id) }, methods: { getArticleById(id) { const articles = [ { id: 1, title: '文章一', content: '文章一的内容' }, { id: 2, title: '文章二', content: '文章二的内容' }, { id: 3, title: '文章三', content: '文章三的内容' } ] return articles.find(article => article.id === id) } } } </script> <style scoped> .container { padding: 10px; background-color: #f0f0f0; } </style>
npm run serve
npm install -g @vue/cli
main.js
文件,确保引入了路由:import Vue from 'vue' import App from './App.vue' import router from './router' Vue.config.productionTip = false new Vue({ router, render: h => h(App) }).$mount('#app')
router/index.js
文件,确保配置了正确的路由:import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' import About from '../views/About.vue' Vue.use(VueRouter) const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', component: About } ] const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes }) export default router
vue.config.js
文件,确保样式配置正确:module.exports = { css: { extract: false, // 禁用 CSS 打包 sourceMap: false, loaderOptions: { sass: { additionalData: '@import "@/styles/global.scss";' } } } }
<template> <div class="container"> <h1>标题</h1> </div> </template> <script> export default { name: 'MyComponent' } </script> <style scoped> .container { background-color: #f0f0f0; padding: 10px; } </style>
优化代码,避免重复引入不必要的依赖。
vue.config.js
中配置代码分割:module.exports = { chainWebpack: config => { config.plugin('extract-css').tap(args => { args[0].filename = '[name].[hash].css' return args }) } }
vue.config.js
中配置压缩:module.exports = { productionSourceMap: false, // 关闭生产环境的 sourceMap configureWebpack: { optimization: { splitChunks: { chunks: 'all' } } } }
通过以上步骤,可以解决热重载无效、样式不生效、打包输出文件体积过大等问题,使项目开发和维护更加高效。