手把手教你vue-cli单页到多页应用的方法

关于“手把手教你vue-cli单页到多页应用的方法”的完整攻略,我可以给你详细讲解一下。

1. 什么是vue-cli

Vue.js是一套构建用户界面的渐进式框架,是目前较为流行的前端框架之一。而vue-cli则是Vue.js的脚手架工具,帮助我们快速生成Vue.js项目基础架构,集成常见的开发配置和工具,大大提升了我们的开发效率。

2. 单页应用和多页应用的区别

单页应用(SPA)是指只有一个HTML页面的Web应用,页面的一些部分会在使用的时候动态更新或者重新加载,从而提供更好的用户体验。

多页应用(MPA)则是指有多个HTML页面的Web应用,每个页面有自己的URL地址,用户请求不同的页面时会重新刷新页面。

3. 将单页应用转化为多页应用

3.1 新建多页面的Webpack配置文件

在Vue CLI项目的根目录创建一个multi-page.config.js文件,用于多页应用的Webpack配置。在这个文件中我们需要做以下配置:

const path = require('path');
const webpack = require('webpack');

// 定义多页应用的页面入口文件
const entries = {
  page1: './src/page1/main.js',
  page2: './src/page2/main.js'
};

// 定义多页应用的HTML文件
const HtmlWebpackPlugin = require('html-webpack-plugin');
const htmlWebpackPluginArr = [];
Object.keys(entries).forEach(function (key) {
  htmlWebpackPluginArr.push(
    new HtmlWebpackPlugin({
      filename: key + '.html',
      chunks: [key],
      template: 'public/index.html',
      inject: true
    })
  );
});

module.exports = {
  entry: entries,

  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name]/[name].js',
    publicPath: '/'
  },

  plugins: htmlWebpackPluginArr,

  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            css: [
              'vue-style-loader',
              'css-loader',
              'postcss-loader'
            ],
            sass: [
              'vue-style-loader',
              'css-loader',
              'sass-loader?indentedSyntax'
            ],
            scss: [
              'vue-style-loader',
              'css-loader',
              'postcss-loader',
              'sass-loader'
            ]
          }
        }
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      },
      {
        test: /\.(png|jpg|gif|svg)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        loader: 'file-loader',
        options: {
          name: '[name].[ext]?[hash]'
        }
      }
    ]
  },

  resolve: {
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': path.resolve(__dirname, './src')
    },
    extensions: ['*', '.js', '.vue', '.json']
  },

  devServer: {
    historyApiFallback: true,
    noInfo: true,
    overlay: true,
    contentBase: './dist',
    open: true,
    hot: true
  },

  performance: {
    hints: false
  },

  devtool: '#eval-source-map'
};

其中,entries定义了多个页面的入口文件,HtmlWebpackPlugin则定义了多个页面的HTML文件。

3.2 修改package.json文件的scripts

我们只需要在原有的scripts命令中加入多页面配置文件的信息即可,如下所示:

"scripts": {
  "dev": "webpack-dev-server --inline --config build/webpack.dev.conf.js && webpack --watch --config multi-page.config.js --progress",
  "build": "node build/build.js",
  "lint": "eslint --ext .js,.vue src",
  "test": "npm run lint",
  "multi": "webpack --config multi-page.config.js"
},

3.3 修改文件路径

我们需要在public/index.html中手动添加指向其他html文件的链接,而我们在此之前需要将所有文件路径都修改一下(如果原路径为<img src="/static/bg.jpg">,我们需要修改为<img src="./static/bg.jpg">),这样路径才不会出错。

最后,我们在public/index.html页面中加入以下代码,用于链接到多页应用的其他页面:

<a href="./page1.html">page1</a>
<a href="./page2.html">page2</a>

3.4 运行

使用npm run multi命令运行Webpack,生成多页应用的构建文件。之后我们就可以愉快地在浏览器中访问多页应用页面了。

4. 示例

下面,我们通过两个简单的示例来说明如何将单页应用转化为多页应用。

4.1 示例一

新建一个Vue CLI项目,选择默认的单页应用模板。在根目录下新建multi-page.config.js文件,并复制上述代码。之后,在./src目录下新建两个目录page1page2。将./src/main.js复制为./src/page1/main.js./src/page2/main.js。在./public目录下新建page1.htmlpage2.html,分别作为两个页面的入口文件。最后,使用npm run multi运行构建,即可得到一个多页应用。

4.2 示例二

还是以单页应用模板为基础,我们先创建两个组件,分别为Page1Page2。在./src目录下新建两个目录page1page2,并在其中创建新的Vue.js组件文件main.js,使用以下内容:

import Vue from 'vue'
import App from '@/App.vue'

new Vue({
  el: '#app',
  render: h => h(App)
})

page1page2两个目录下,都创建index.html文件,内容分别为:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>page1</title>
</head>
<body>
  <div id="app"></div>
  <script src="./main.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>page2</title>
</head>
<body>
  <div id="app"></div>
  <script src="./main.js"></script>
</body>
</html>

最后,修改public/index.html文件,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>single-page-app</title>
</head>
<body>
  <nav>
    <a href="./page1/index.html">page1</a>
    <a href="./page2/index.html">page2</a>
  </nav>
</body>
</html>

使用npm run multi进行构建,最终我们能得到一个基于Vue.js的多页应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手教你vue-cli单页到多页应用的方法 - Python技术站

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

相关文章

  • vue props default Array或是Object的正确写法说明

    对于“vue props default Array或是Object的正确写法说明”,主要包括以下内容: 使用函数返回值作为默认值 使用工厂函数生成默认值 示例一:使用函数返回值作为默认值 对于Array类型的props,可以使用函数返回默认值。以下是一个示例: props: { list: { type: Array, default: function(…

    Vue 2023年5月28日
    00
  • Vue+element自定义指令如何实现表格横向拖拽

    让我为你详细讲解“Vue+element自定义指令如何实现表格横向拖拽”的完整攻略。 什么是自定义指令? 自定义指令是Vue.js提供的一个强大的特性,它可以让我们在模板中自定义一些行为,比如手动绑定事件或者操作DOM元素。自定义指令在实现特定功能时是非常有用和方便的。 横向拖拽指令的实现 我们可以结合Vue和element框架来实现表格的横向拖拽功能。具体…

    Vue 2023年5月27日
    00
  • vue实现右上角时间显示实时刷新

    下面我将详细讲解在Vue项目中如何实现右上角时间显示的实时刷新。 一、示例一——使用setInterval 首先,在Vue组件中,我们需要定义两个数据:一个用来保存当前时间的变量和一个用来保存计时器的变量。可以在data中定义这两个变量: data() { return { currentTime: ”, timer: null } } 接着,在mount…

    Vue 2023年5月29日
    00
  • Vue中四种操作dom方法保姆级讲解

    下面我就为你详细讲解一下“Vue中四种操作dom方法保姆级讲解”的攻略。 1. Vue中的DOM操作 在Vue中,我们可以通过四种方法操作DOM元素,这四种方法分别是:插入、更新、删除和替换。下面我们就来仔细看看这四种方法。 2. 插入一个DOM元素 我们可以利用Vue提供的v-html指令或{{}}插值语法插入一个DOM元素。以v-html指令为例,它可以…

    Vue 2023年5月27日
    00
  • vue里使用create,mounted调用方法的正确姿势说明

    接下来我来详细讲解“Vue中使用created和mounted调用方法的正确方式”。 1. created 和 mounted Vue 组件的生命周期函数可以分为 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。今天我们主要来讲解其中的…

    Vue 2023年5月28日
    00
  • 解决Element中el-date-picker组件不回填的情况

    问题背景:Element UI 中 el-date-picker 组件在使用时有可能出现选择日期后无法回填的情况,即选择的日期无法正确显示在输入框中。这种情况出现的原因是由于用户未绑定 v-model 或者 v-model 绑定的变量内容不正确导致。 解决方案:由于该问题可能是由多方面问题引起的,此文将从以下几个方面详细讲解如何解决这个问题。 确认 v-mo…

    Vue 2023年5月29日
    00
  • Vue路由钩子之afterEach beforeEach的区别详解

    Vue路由钩子之afterEach beforeEach的区别详解 在Vue中,路由钩子是非常重要的一部分,他们可以在路由发生变化的时候执行一些动作。Vue提供了两种不同的路由钩子:beforeEach和afterEach。他们两个之间有什么区别呢?下面就详细进行讲解。 beforeEach beforeEach是你可以使用的一种路由钩子。在路由跳转之前,b…

    Vue 2023年5月27日
    00
  • vue.js中ref和$refs的使用及示例讲解

    Vue.js中ref和$refs的使用及示例讲解 什么是ref 在Vue.js中,ref是用来获取元素或组件标识的指令,相当于“id”或“class”属性,我们可以在Vue实例中通过$refs对象访问它们。主要有以下两种用法: 1.在DOM元素上使用ref 在DOM元素上使用ref可以获取DOM节点元素,我们可以通过引用这个DOM节点元素,使用原生JavaS…

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