Vue+webpack项目配置便于维护的目录结构教程详解

yizhihongxing

下面我将详细讲解“Vue+webpack项目配置便于维护的目录结构教程详解”的完整攻略。

1. 开始前的准备

首先需要确保已经正确安装了Node.js和Vue-cli,并且创建了一个基于Vue-cli的项目。

2. 目录结构设计

在Vue-cli创建的项目中,已经自带了一些目录和文件,如下所示:

.
├── README.md
├── babel.config.js
├── node_modules
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
└── src
    ├── App.vue
    ├── assets
    │   └── logo.png
    ├── components
    │   └── HelloWorld.vue
    └── main.js

但是这个目录结构并不符合我们的需求,我们需要重新设计一个目录结构。我们可以把不同的功能模块分别放到不同的目录下。

下面是一个比较通用的目录结构示例:

.
├── dist                         // 打包后目录
├── node_modules                 // 依赖目录
├── public                       // 公共目录
│   ├── favicon.ico             // 网站图标(可更换)
│   └── index.html              // 网站首页
├── src                          // 源码目录
│   ├── api                      // 接口封装
│   ├── assets                   // 静态资源
│   ├── common                   // 全局公共文件(如常量、工具方法等)
│   ├── components               // 组件
│   ├── router                   // 路由配置
│   ├── store                    // 状态管理
│   ├── styles                   // 样式
│   ├── views                    // 页面
│   ├── App.vue                  // 页面入口文件
│   └── main.js                  // 程序入口文件,加载各种公共组件
├── .babelrc                     // Babel配置文件
├── .gitignore                   // git忽略配置
├── package.json                 // 依赖配置
├── README.md                    // 项目说明文档
├── webpack.base.js              // webpack基础配置
├── webpack.dev.js               // webpack开发环境配置
└── webpack.prod.js              // webpack生产环境配置

我们可以根据实际需求对目录结构进行调整。

3. webpack配置

到这里,我们已经有了一个合适的目录结构,还需要配置webpack来让工程可以正常运行。

我们可以将webpack配置分成基本配置和环境配置两个部分。基本配置是所有环境通用的,包括打包入口、输出目录、外部模块、样式处理等。而开发环境和生产环境不同之处在于开发环境需要热加载、soucemap等功能,而生产环境则需要压缩、混淆、分离等功能。

以下是两个示例webpack配置文件,可以根据需要进行调整:

webpack.base.js

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: '[name].[hash].js',
    publicPath: '/'
  },
  resolve: {
    alias: {
      '@': path.resolve(__dirname, '../src'),
      'styles': path.resolve(__dirname, '../src/styles')
    }
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader'
        }
      },
      {
        test: /\.css$/,
        use: [
          process.env.NODE_ENV === 'production'
            ? MiniCssExtractPlugin.loader
            : 'vue-style-loader',
          'css-loader'
        ]
      },
      {
        test: /\.scss$/,
        use: [
          process.env.NODE_ENV === 'production'
            ? MiniCssExtractPlugin.loader
            : 'vue-style-loader',
          'css-loader',
          'sass-loader'
        ]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: 'img/[name].[hash:7].[ext]'
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: 'fonts/[name].[hash:7].[ext]'
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: 'public/index.html',
      inject: true
    })
  ]
}

webpack.dev.js

const merge = require('webpack-merge')
const webpackBaseConfig = require('./webpack.base')
const webpack = require('webpack')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

module.exports = merge(webpackBaseConfig, {
  mode: 'development',
  devtool: 'cheap-module-eval-source-map',
  devServer: {
    historyApiFallback: true,
    hot: true,
    port: 8080,
    overlay: true
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new FriendlyErrorsPlugin({
      compilationSuccessInfo: {
        messages: [
          `Your application is running here: http://localhost:8080`
        ]
      }
    })
  ]
})

webpack.prod.js

const merge = require('webpack-merge')
const webpackBaseConfig = require('./webpack.base')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const webpack = require('webpack')

module.exports = merge(webpackBaseConfig, {
  mode: 'production',
  devtool: 'source-map',
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        uglifyOptions: {
          compress: {
            warnings: false,
            drop_console: true,
            drop_debugger: true
          }
        },
        sourceMap: true,
        parallel: true
      }),
      new OptimizeCSSAssetsPlugin({
        cssProcessorOptions: {
          map: {
            inline: false,
            annotation: true
          }
        }
      })
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css',
      allChunks: true
    }),
    new webpack.optimize.ModuleConcatenationPlugin()
  ]
})

以上是webpack配置文件的示例,可以根据项目需求进行调整。

4. 示例解释

这里给出两个示例,一个示例是调用后端API来加载数据并渲染页面,一个示例是使用第三方组件库Ant Design Vue。

示例一:调用后端API

在src/api目录下,我们可以定义一些封装了接口调用逻辑的API函数,示例代码如下:

import axios from 'axios'

const api = {
  getList () {
    return axios.get('/api/list').then(res => res.data)
  },

  getDetail (id) {
    return axios.get(`/api/detail?id=${id}`).then(res => res.data)
  }
}

export default api

这里使用了Axios来发送HTTP请求。

接下来,在views目录下,我们可以定义一些页面级组件,如List.vue和Detail.vue。这些组件可以调用API函数来获取数据并渲染页面。示例代码如下:

List.vue

<template>
  <div class="list">
    <div class="item" v-for="item in list">
      <h2>{{ item.title }}</h2>
      <p>{{ item.content }}</p>
    </div>
  </div>
</template>

<script>
import api from '@/api'

export default {
  data () {
    return {
      list: []
    }
  },
  created () {
    api.getList().then(res => {
      this.list = res
    })
  }
}
</script>

<style lang="scss" scoped>
.list {
  .item {
    h2 {
      font-size: 16px;
      margin-bottom: 10px;
    }
  }
}
</style>

Detail.vue

<template>
  <div class="detail">
    <h1>{{ detail.title }}</h1>
    <div class="content">{{ detail.content }}</div>
  </div>
</template>

<script>
import api from '@/api'

export default {
  data () {
    return {
      detail: {}
    }
  },
  created () {
    api.getDetail(this.$route.params.id).then(res => {
      this.detail = res
    })
  }
}
</script>

<style lang="scss" scoped>
.detail {
  h1 {
    font-size: 24px;
    margin-bottom: 10px;
  }
  .content {
    margin-top: 20px;
  }
}
</style>

示例二:使用Ant Design Vue

Ant Design Vue是一个很流行的组件库,可以加速项目开发。我们可以使用它来改善项目的UI效果。

首先需要安装Ant Design Vue:

npm install ant-design-vue -S

然后在main.js中引入Ant Design Vue并使用:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'

Vue.use(Antd)

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

接下来,在使用Ant Design Vue的组件时,需要按照官方文档进行使用。例如:

<!-- 使用Ant Design Vue的Button组件 -->
<template>
  <div class="hello">
    <p>{{ msg }}</p>
    <a-button type="primary" @click="handleClick">点击</a-button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      msg: 'Hello Ant Design Vue!'
    }
  },
  methods: {
    handleClick () {
      console.log('Click')
    }
  }
}
</script>

<style lang="scss" scoped>
.hello {
  padding: 20px;
}
</style>

5. 总结

以上就是“Vue+webpack项目配置便于维护的目录结构教程详解”的完整攻略。我们把不同的功能模块分别放到不同目录下,通过webpack的配置来让工程可以正常运行。同时,提供使用示例,可以参考实际项目开发需要进行调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue+webpack项目配置便于维护的目录结构教程详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue中使用装饰器的方法详解

    Vue中使用装饰器的方法可以帮助我们更加方便和优雅地编写代码,本篇文章将为大家详细介绍如何在Vue中使用装饰器。 什么是装饰器 装饰器是一种特殊的语法,可以修改类或者类中的方法。它本质上是一个函数,接受一个类或者类中的方法作为参数,返回修改后的类或者方法。在ES7中,装饰器的提案已经被纳入到正式规范中。 Vue中使用装饰器的方法 Vue中可以使用装饰器来装饰…

    Vue 2023年5月28日
    00
  • vue指令以及dom操作详解

    Vue指令以及DOM操作详解 在Vue中,指令(Directive)是一个带有 v- 前缀的特殊属性。指令用于在模板中添加特殊的行为,常见的指令有v-if、v-for、v-bind、v-on等。 v-if指令 v-if指令用于根据表达式的值的真假,来切换元素的存在。例如下面这个示例: <div v-if="showFlag">…

    Vue 2023年5月27日
    00
  • vue中jsonp插件的使用方法示例

    下面是“vue中jsonp插件的使用方法示例”的完整攻略。 1. 什么是JSONP JSONP,全称为“JSON with Padding”,是一种用于解决跨域请求的技术。在同源策略的限制下,通过script标签的src属性发送请求,服务器返回一段被包裹在回调函数中的JSON数据,然后前端将其解析并使用。 2. JSONP插件在Vue中的使用方法 在Vue中…

    Vue 2023年5月28日
    00
  • vite+vue3.0+ts+element-plus快速搭建项目的实现

    一、背景介绍 在前端开发过程中,我们需要使用一些构建工具来快速搭建项目,而vite是一个新兴的前端构建工具,可以快速构建现代Web应用程序。 Vue3.0是Vue.js框架的最新版本,相比于Vue2.0,性能更加优越、语法更加简洁明了、开发效率更高。 对于TypeScript开发者,TypeScript提供了更强大的类型检查和自动补全功能,可以提高代码的健壮…

    Vue 2023年5月28日
    00
  • vue项目中引入vue-datepicker插件的详解

    引入 vue-datepicker 插件,主要需要以下几个步骤: 1. 安装 vue-datepicker 插件 使用 npm 或 yarn 安装该插件: npm install vue-datepicker –save # 或 yarn add vue-datepicker 2. 在 main.js 中注册插件 在 main.js 文件中添加如下代码: …

    Vue 2023年5月29日
    00
  • Vue封装–如何将数字转换成万

    下面是“Vue封装–如何将数字转换成万”的攻略: 一、问题描述 有时候我们需要将一些数据进行格式化,比如将一些较大的数字转换成“万”表示,以增强数据阅读的易读性。那么在Vue中,我们怎么封装一个可以将数字自动转换成“万”表示的方法呢? 二、解决方案 在Vue中,我们可以通过封装一个公共组件的方式来实现此功能。具体实现方式如下: 1. 创建一个公共组件 在V…

    Vue 2023年5月27日
    00
  • vue scss后缀文件background-image路径错误的解决

    当使用Vue结合SCSS编写样式时,如果在样式中设置了background-image属性,并且设置的路径存在问题,那么会导致图片无法正常加载。下面是解决该问题的完整攻略: 问题分析 样式中设置background-image属性使用的是相对路径,而在Vue项目中,其相对路径往往是相对于main.js文件或者Vue组件所在位置的路径。如果图片的相对路径出现问…

    Vue 2023年5月28日
    00
  • vue3自定义指令看完这篇就入门了

    下面是关于“vue3自定义指令看完这篇就入门了”的详细讲解攻略,包含了自定义指令的概念、用法和示例说明。 什么是自定义指令? 在Vue中,指令是用于在模板中添加特殊处理逻辑的特殊属性。指令有很多内置的,例如:v-if、v-for、v-bind等等。除了内置指令外,也可以通过Vue提供的Vue.directive()方法来自定义指令。 自定义指令能够帮助我们更…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部