详解vue-cli脚手架build目录中的dev-server.js配置文件

yizhihongxing

【攻略】详解vue-cli脚手架build目录中的dev-server.js配置文件

在Vue.js的项目中,build目录中的dev-server.js文件负责创建一个开发服务器,来帮助我们优化开发阶段的开发体验。该文件中包含了很多重要的配置项,接下来我们将详细讲解这些配置项。

dev-server.js文件的基本结构

首先,我们来看一下dev-server.js文件的基本结构:

const webpack = require('webpack')
const merge = require('webpack-merge')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const baseWebpackConfig = require('./webpack.base.conf')
const utils = require('./utils')
const config = require('../config')

const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)

const devWebpackConfig = merge(baseWebpackConfig, {
  mode: 'development',
  devtool: config.dev.devtool,
  devServer: {
    clientLogLevel: 'warning',
    // ...
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': require('../config/dev.env')
    }),
    // ...
  ]
})

module.exports = new Promise((resolve, reject) => {
  portfinder.basePort = PORT || config.dev.port
  portfinder.getPort((err, port) => {
    if (err) {
      reject(err)
    } else {
      process.env.PORT = port
      devWebpackConfig.devServer.port = port

      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
        // ...
      }))

      resolve(devWebpackConfig)
    }
  })
})

从代码中可以看到,该文件中引入了许多node模块和其他文件的模块,接下来我们将对这些引入的模块和配置对象进行详解。

引入的模块

  1. webpack: webpack是一个现代JavaScript应用程序的静态模块打包器。
  2. webpack-merge: 合并wp配置的一个工具。建议先了解 require('./webpack.base.conf') 及下文中的merge。
  3. FriendlyErrorsPlugin: 乐于助人的报错信息展示插件,能以更清晰的形式描述webpack编译时出错的位置的详细信息。

config.dev.*

在config目录中我们可以看到一个dev.env.js和dev.js文件,这两个文件会在dev-server.js文件中被引用,其作用如下:

  • config.dev.env: 开发环境中使用的配置项,如开发环境中运行的地址baseUrl、node环境等。
  • config.dev: 开发环境的webpack配置项,如启动的服务器端口号port等。

devServer配置

除了引入的模块和config.dev.之外,该文件的主要配置是在devWebpackConfig对象下进行的。

而devWebpackConfig下最主要的配置就是devServer:

devServer: {
  clientLogLevel: 'warning', // 告诉服务器记录级别
  ...
}

devServer的常用配置项

  • contentBase: 告诉服务器从哪里提供内容,默认情况下是从项目根目录提供内容。
  • host: 指定使用一个 host。默认是 localhost。如果你希望服务器外部可访问,指定如下:0.0.0.0
  • port: 端口号。
  • proxy: 配置代理跨域。
  • compress: 一切服务都启用gzip 压缩。
  • historyApiFallback: 任意的 404 响应可以提供为 index.html 页面的内容。用来解决vue-router在history模式下刷新页面会报404的问题。
  • hot: 启用 webpack 的模块热替换特性。
  • https: 启用 https。
  • noInfo: 关闭所有打印到控制台的无用信息。
  • overlay: 在浏览器中显示编译时的错误信息。
  • publicPath: 访问资源加前缀。
  • quiet: 如果你不想让 dev server 向控制台输出任何内容,选项可以开启。
  • watchOptions: 监控文件改动时候,delay多久重新打包,不会每按一个键都联网请求数据,可以提高性能。

最佳实践

在实际开发中,我们可能还要对devServer进行其他的配置。以下是两个常用的示例:

1. webpack-dev-server启用Gzip压缩

devServer: {
  after(app, server) {
    app.use(
      require('compression')({
        algorithm: 'gzip',
        threshold: 10240,
        minRatio: 0.8
      })
    )
  }
}

这里我们使用了compression模块来启用Gzip压缩,其中的参数说明如下:

  • algorithm: 设置压缩算法
  • threshold: 只有大小大于该值的资源会被处理
  • minRatio: 只有压缩率小于这个值的资源才会被处理

2. 解决在热更新下vue-router刷新页面会出现404错误的问题

在启用热更新(hot)时,会出现vue-router中hash模式下,路由正常跳转,但刷新页面会出现404错误的问题。这是因为热更新被加入进来后,对于路由的跳转是不触发整个页面的重新渲染的,所以在刷新页面时,浏览器会请求当前路径下的index.html文件,但此文件不存在,所以出现404错误。

解决这个问题的方法是在devServer的historyApiFallback选项中将rewrites配置为空:

devServer: {
  historyApiFallback: {
    rewrites: [
      {
        from: /.*/,
        to: path.posix.join(config.dev.assetsPublicPath, 'index.html'),
      },
    ],
  },
},

在配置文件中加入这一行配置后,热更新下的vue-router引用本地文件完成,刷新页面时也不会出现404错误。

总结

以上就是对vue-cli脚手架build目录中的dev-server.js配置文件进行的详细讲解。在实际项目中,配置项会因项目而异,但是对于一些常用的配置,我们需要熟练掌握。通过学习此文,相信读者已经对于dev-server.js文件的基本结构以及常用配置有了理解,并可根据实际需求对此文件进行修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解vue-cli脚手架build目录中的dev-server.js配置文件 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 使用HTML5原生对话框元素并轻松创建模态框组件

    下面是使用HTML5原生对话框元素并轻松创建模态框组件的完整攻略。 概述 HTML5引入了一个新的对话框元素<dialog>,可以用来创建模态框对话框。模态框对话框可以在用户操作未完成时阻止其他交互,并向用户提供可选择的选项。在本攻略中,我们将通过一个实例和代码示例的方式来讲解如何使用这个元素来创建模态框组件。 步骤 步骤一:创建一个模态框组件 …

    JavaScript 2023年6月11日
    00
  • 深入理解vue3中的reactive()

    当谈到Vue的响应式系统时,有一个重要的函数:reactive()。在Vue3中,reactive()是我们创建响应式对象的首选方法。 1. reactive()函数的作用 reactive()函数可将一个普通JavaScript对象转换为响应式对象,从而使对象的属性变为可观察和自动更新的。这意味着,当响应式对象的某个属性发生变化时,Vue会自动使用新的值重…

    JavaScript 2023年6月10日
    00
  • JS实现悬浮移动窗口(悬浮广告)的特效

    要实现JS实现悬浮移动窗口(悬浮广告)的特效,需要以下步骤: 1. HTML结构准备 首先,需要在HTML文件中添加一个div作为悬浮窗口的容器,以及一个button作为关闭悬浮窗口的按钮。例如: <div id="float-window"> <button id="close-button"&gt…

    JavaScript 2023年6月11日
    00
  • Javascript实现html转pdf高清版(提高分辨率)

    让我来讲解一下Javascript实现html转pdf高清版的完整攻略。 1. 准备工作 在进行Javascript实现html转pdf高清版之前,需要准备以下工作: 安装Node.js环境,可以从Node.js官网下载安装; 安装相关的npm包,例如puppeteer和sharp,可以在命令行中执行以下命令进行安装: npm install puppete…

    JavaScript 2023年5月27日
    00
  • bootstrapValidator自定验证方法写法

    下面是关于”bootstrapValidator自定验证方法写法”的完整攻略,具体步骤如下: 步骤一:引入bootstrapValidator 在HTML中引入bootstrapValidator库,同时还需要引入jQuery库和bootstrap库。代码示例如下: <!– 引入jQuery库 –> <script src="…

    JavaScript 2023年6月10日
    00
  • Android应用开发中WebView的常用方法笔记整理

    以下是详细讲解“Android应用开发中WebView的常用方法笔记整理”的完整攻略: 简介 在Android应用开发中,WebView是常见的一个控件,它可以在应用中展示网页、HTML内容或其他的网络资源。在本篇攻略中,我们将讲解Android应用开发中WebView的常用方法和技巧。 基本用法 首先,让我们来看一下WebView的基本用法。 添加权限 在…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript系列(31):设计模式之代理模式详解

    深入理解JavaScript系列(31):设计模式之代理模式详解 概述 代理模式是一种结构型模式,其中一个对象充当另一个对象的接口,以控制对该对象的访问。 这种类型的设计模式属于结构模式,它对对象进行组合,以提供新的功能,同时使代码更易于维护。 在 JavaScript 中,代理模式允许我们在运行时动态地创建对象并控制其行为。 代理可以隔离对实际对象的访问,…

    JavaScript 2023年6月11日
    00
  • jQuery电话号码验证实例

    下面我将详细讲解一下如何实现“jQuery电话号码验证实例”。 1. 前置知识 在开始正式的实例讲解之前,我们先来了解一些前置知识: 1.1 jQuery jQuery是一款非常流行的JavaScript库,可以使JavaScript编写DOM操作和事件处理等变得更加简单、快捷和优雅。如果你还不熟悉它,可以参考官方文档:jQuery文档。 1.2 正则表达式…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部