vue1.0中的dev-server.js配置文件

本文详细解析Vue CLI脚手架中dev-server.js配置文件的内容及作用,介绍该文件作为开发环境入口配置的重要性,涵盖模块引入、环境变量设置、代理配置等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  • 这个配置文件是命令npm run devnpm run start 的入口配置文件,主要用于开发环境
  • 由于这是一个系统的配置文件,将涉及很多的模块和插件,所以这部分内容我将分多个文章讲解,请关注我博客的其他文章
关于注释
  • 当涉及到较复杂的解释我将通过标识的方式(如(1))将解释写到单独的注释模块,请自行查看
上代码
// 导入check-versions.js文件,并且执行导入的函数,用来确定当前环境node和npm版本是否符合要求
require('./check-versions')()
// 导入config目录下的index.js配置文件,此配置文件中定义了生产和开发环境中所要用到的一些参数
var config = require('../config')
// 下面表示如果如果没有定义全局变量NODE_ENV,则将NODE_ENV设置为"development"
if (!process.env.NODE_ENV) {
    process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
// opn插件是用来打开特定终端的,此文件用来在默认浏览器中打开链接 opn(url)
var opn = require('opn')
// nodejs路径模块
var path = require('path')
// nodejs开发框架express,用来简化操作,有兴趣可以自行去了解
var express = require('express')
// 引入webpack模块,用来使用webpack内置插件
var webpack = require('webpack')
// 引入http-proxy-middleware插件,此插件是用来代理请求的只能用于开发环境,目的主要是解决跨域请求后台api
var proxyMiddleware = require('http-proxy-middleware')
// 下面的意思是指,如果不是testing环境就引入webpack.dev.conf.js配置文件
// 关于webpack.dev.conf.js配置文件请关注我的相关文章,建议现在就去看,否则后面看着吃力
var webpackConfig = process.env.NODE_ENV === 'testing' ?
    require('./webpack.prod.conf') :
    require('./webpack.dev.conf')

// default port where dev server listens for incoming traffic
// 下面是webpack-dev-server 监听的端口号,因为没有设置process.env.PORT,所以下面监听的就是config.dev.port
//即8080
var port = process.env.PORT || config.dev.port
    // automatically open browser, if not set will be false
// 下面是true,至于为啥,本来就是true还要加!!两个感叹号,估计是vue作者装了个逼吧
var autoOpenBrowser = !!config.dev.autoOpenBrowser
    // Define HTTP proxies to your custom API backend
    // https://github.com/chimurai/http-proxy-middleware
// 下面是解决开发环境跨域问题的插件,我在config目录index.js文章中有介绍,自行查看
var proxyTable = config.dev.proxyTable
// 下面是创建node.js的express开发框架的实例,别问我为什么这样,自己看node.js去吧
var app = express()
// 把配置参数传递到webpack方法中,返回一个编译对象,这个编译对象上面有很多属性,自己去看吧,主要是用到里面
//的状态函数 如compilation,compile,after-emit这类的
var compiler = webpack(webpackConfig)
// 下面是webpack-dev-middleware和webpack-hot-middleware两兄弟,这两个是黄金组合
// 而vue作者用这两个插件也是用的最基本的形式,详情看(1) (2)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
    publicPath: webpackConfig.output.publicPath,
    quiet: true  // 使用friendly-errors-webpack-plugin插件这个必须设置为true
})

var hotMiddleware = require('webpack-hot-middleware')(compiler, {
        log: () => {} // 使用friendly-errors-webpack-plugin插件这个必须设置为true
    })
    // force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function(compilation) {
// webpack任何一个插件都plugin这个方法,里面可以传递钩子函数,用来在插件各个阶段做特殊处理,钩子函数种类很多
    compilation.plugin('html-webpack-plugin-after-emit', function(data, cb) {
        // 当插件html-webpack-plugin产出完成之后,强制刷新浏览器
        hotMiddleware.publish({ action: 'reload' })
        cb()
    })
})

// proxy api requests
Object.keys(proxyTable).forEach(function(context) {
// 下面是代理表的处理方法,看看就行了,几乎用不上,除非你是全栈,不用webpack-dev-server,使用后台语言做服务器
    var options = proxyTable[context]
    if (typeof options === 'string') {
        options = { target: options }
    }
    app.use(proxyMiddleware(options.filter || context, options))
})

// handle fallback for HTML5 history API
// 这个插件是用来解决单页面应用,点击刷新按钮和通过其他search值定位页面的404错误
// 详情请看(3)
app.use(require('connect-history-api-fallback')())

// serve webpack bundle output
// app.use是在响应请求之前执行的,用来指定静态路径,挂载静态资源
app.use(devMiddleware)

// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)

// serve pure static assets
// 下面的staticPath是 static ,path.posix.join
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
// 挂载静态资源,下面的方法是用虚拟目录来访问资源,staticPath就是虚拟目录路径,不管设不设置都是static
app.use(staticPath, express.static('./static'))
// 下面结果就是 'http://localhost:8080'
var uri = 'http://localhost:' + port

// 下面是es6的promise规范,用来处理嵌套请求的
var _resolve
var readyPromise = new Promise(resolve => {
    _resolve = resolve // resolve是一个回调函数专门用来传递成功请求的数据
})
// 下面是加载动画
console.log('> Starting dev server...')
// waitUntilValid是webpack-dev-middleware实例的方法,在编译成功之后调用
devMiddleware.waitUntilValid(() => {
    console.log('> Listening at ' + uri + '\n')
        // when env is testing, don't need open it
        // 测试环境不打开浏览器
    if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
        opn(uri)
    }
    _resolve() // 这里没有传递数据,这只是在模拟
})
// node.js监听端口
var server = app.listen(port)
// 这个导出对象是用来对外提供操作服务器和接受数据的接口,vue作者可谓考虑颇深啊
module.exports = {
    ready: readyPromise, // promise实例,可以通过readyPromise.then收到数据
    close: () => {
        server.close() // 关闭服务器
    }
}

解释

(1)webpack-dev-middleware插件
  • 这个插件只能用于开发环境,下面是这个插件的解释
  • 这是一个简洁的webpack包装中间件,这个插件做这个主要为文件做一件事情,就是当文件修改后提交到webpack服务器,然后处理这些修改后的文件
  • 这个插件有一下几个优点
    • 第一,所有的文件都是写在disk上,文件的处理在内存中进行
    • 第二,如果文件在watch模式下被改动,这个中间件将不会为这些老的bundle服务了,如果这些老的bundle上有文件改动, 这个中间件将不会发送请求,而是等到当前编译结束,当前最新的文件有改动,才会发送请求,所以你不需要手动刷新了
    • 第三,我会在以后的版本中优化
  • 总结,这个中间件是webpack-dev-server的核心,实现修改文件,webapack自动刷新的功能
  • 安装 npm install webpack-deb-middleware --save-dev
  • 使用方法如下,下面的使用方法也是webpack-dev-server实现的代码
 var webpackMiddleware = require("webpack-deb-middleware");
   app.use(webpackMiddleware(webpack({obj1}),{obj2}))
  • app.use是express的方法,用来设置静态路径
  • 上面的obj1是webpack配置对象,使用webpack方法转换成compiler编译对象,obj2配置的是更新文件打包后的配置,使用
  • webpackMiddleware处理之后,就返回一个静态路径,方便获取文件关于obj2的配置项,可以自行查阅,必须要添加publicPath
  • 我们的静态服务器是node.js,现在文件修改了,webpack-dev-middleware将修改的文件编译后,告诉nodejs服务器哪些文件修改了
  • 并且把最新的文件上传到静态服务器
(2)webpack-hot-middleware插件
  • 这个插件是用来将webpack-dev-middleware编译更新后的文件通知浏览器,并且告诉浏览器如何更新文件,从而实现 Webpack hot reloading
  • 将这两个插件配合起来使用你就可以不需要webpack-dev-sever,即可以自己实现hot-replacement热替换功能,
  • webpack-hot-middleware插件通知浏览器更新文件大致是通过一个json对象实现的,具体实现机制这里不多说了,下面来看具体用法
  • 安装 npm install webpack-hot-middleware --save-dev
  • 在使用了webpack-dev-middleware之后,在添加如下代码即可
app.use(require("webpack-hot-middleware")(compiler));
(3)connect-history-api-fallback插件
  • 因为在开发单页面应用时,总的来说项目就一个页面,如果通过点击刷新按钮并且此时链接指的不是主页的地址,就会404;或者我通过其他的链接比如 /login.html 但是并没有login.html就会报错
  • 而这个插件的作用就是当有不正当的操作导致404的情况,就把页面定位到默认的index.html
  • 使用起来也比较简单,记住这样用就可以了
    安装 npm install --save connect-history-api-fallback
    使用 var history = require('connect-history-api-fallback');
 var express = require('express');
   var app = express();
   app.use(history());

转至:https://www.cnblogs.com/ye-hcj/p/7091706.html

Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.5.3/maven-release-plugin-2.5.3.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.5.3/maven-release-plugin-2.5.3.pom (11 kB at 1.0 MB/s) Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/release/maven-release/2.5.3/maven-release-2.5.3.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/release/maven-release/2.5.3/maven-release-2.5.3.pom (5.0 kB at 502 kB/s) Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/27/maven-parent-27.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/27/maven-parent-27.pom (41 kB at 3.7 MB/s) Downloading from central: https://repo.maven.apache.org/maven2/org/apache/apache/17/apache-17.pom Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/apache/17/apache-17.pom (16 kB at 1.5 MB/s) Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.5.3/maven-release-plugin-2.5.3.jar Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.5.3/maven-release-plugin-2.5.3.jar (53 kB at 4.1 MB/s) Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml Downloading from central: https://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-metadata.xml (14 kB at 1.3 MB/s) Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/mojo/maven-metadata.xml (21 kB at 764 kB/s) [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.954 s [INFO] Finished at: 2025-07-09T06:18:06Z [INFO] ------------------------------------------------------------------------ [ERROR] No plugin found for prefix 'spring-boot' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/root/.m2/repository), central (https://repo.maven.apache.org/maven2)] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/NoPluginFoundForPrefixException root@srv771551:~/jeecg-boot# cd ../jeecgboot-vue3 -bash: cd: ../jeecgboot-vue3: No such file or directory root@srv771551:~/jeecg-boot# npm install npm run dev npm ERR! code ENOENT npm ERR! syscall open npm ERR! path /root/jeecg-boot/package.json npm ERR! errno -2 npm ERR! enoent ENOENT: no such file or directory, open '/root/jeecg-boot/package.json' npm ERR! enoent This is related to npm not being able to find a file. npm ERR! enoent npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2025-07-09T06_18_32_236Z-debug-0.log npm ERR! code ENOENT npm ERR! syscall open npm ERR! path /root/jeecg-boot/package.json npm ERR! errno -2 npm ERR! enoent ENOENT: no such file or directory, open '/root/jeecg-boot/package.json' npm ERR! enoent This is related to npm not being able to find a file. npm ERR! enoent npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2025-07-09T06_18_34_357Z-debug-0.log root@srv771551:~/jeecg-boot#
最新发布
07-10
<think>我们正在解决用户在使用Docker Compose部署JEECG Boot应用时遇到的问题。用户遇到了三个主要问题: 1. docker-compose配置错误(之前用户输入的命令行中出现了很多“command not found”错误,可能是配置格式错误或命令执行方式不当) 2. Maven插件找不到(可能是构建过程中Maven依赖问题) 3. npm package.json不存在(可能是前端构建时缺少package.json文件) 根据引用内容,我们可以参考以下步骤来解决: 一、解决docker-compose配置错误 根据引用[1]和引用[3],正确的docker-compose.yml配置应该包含服务定义、环境变量、端口映射、卷挂载等。用户之前输入的命令行中出现了很多错误,可能是因为直接在shell中输入了yaml格式的内容,而不是在配置文件中编写。 步骤: 1. 创建一个docker-compose.yml文件,并按照正确的yaml格式编写。 2. 确保在包含docker-compose.yml的目录下运行命令。 示例docker-compose.yml(针对JEECG Boot): 参考引用[3]和引用[5],我们可以这样配置: ```yaml version: '3' services: # 后端服务 jeecg-boot: build: context: . # Dockerfile所在目录 dockerfile: Dockerfile image: jeecg-boot:latest container_name: jeecg-boot ports: - "8080:8080" # 主机端口:容器端口 environment: - TZ=Asia/Shanghai - SPRING_PROFILES_ACTIVE=prod # 数据库连接信息,根据实际情况修改 - DATABASE_HOST=mysql - DATABASE_PORT=3306 - DATABASE_NAME=jeecg-boot - DATABASE_USER=root - DATABASE_PASSWORD=your_mysql_password depends_on: - mysql networks: - jeecg-network # MySQL服务 mysql: image: mysql:5.7 container_name: mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=your_mysql_password - MYSQL_DATABASE=jeecg-boot volumes: - mysql-data:/var/lib/mysql networks: - jeecg-network # 前端服务(如果前端单独部署) # jeecg-web: # ... 类似配置 networks: jeecg-network: driver: bridge volumes: mysql-data: ``` 注意:请将`your_mysql_password`替换为实际的密码。 二、解决Maven插件找不到的问题 在构建后端服务时,如果出现Maven插件找不到,可能是由于网络问题或者本地仓库没有对应的插件。 解决方案: 1. 确保在Dockerfile中构建项目时使用正确的Maven镜像,并且能够访问Maven中央仓库(或者配置了国内镜像)。 2. 参考引用[4],可以配置Nexus私服,并在Maven的settings.xml中配置镜像。 示例Dockerfile(后端): 引用[1]中提供了一个Dockerfile示例,但它是直接使用jar包的。如果需要在容器内构建,可以这样: ```Dockerfile # 第一阶段:构建 FROM maven:3.6.3-openjdk-17 AS build WORKDIR /app COPY . . RUN mvn clean package -DskipTests # 第二阶段:运行 FROM openjdk:17 WORKDIR /opt COPY --from=build /app/ruoyi-admin/target/ruoyi-admin.jar ./ CMD ["java", "-jar", "ruoyi-admin.jar"] ``` 如果不需要在容器内构建,则可以在主机上构建好,然后只复制jar包(如引用[1]所示)。 三、解决npm package.json不存在的问题 如果前端项目需要构建,而构建过程中提示package.json不存在,可能是由于以下原因: 1. 前端项目目录没有正确复制到容器中。 2. Dockerfile中构建前端时的工作目录设置错误。 解决方案: 1. 确保在Dockerfile中复制前端项目时,路径正确。 2. 单独为前端服务编写Dockerfile,并在docker-compose.yml中配置。 示例前端Dockerfile(假设前端项目在`web`目录下): ```Dockerfile # 构建前端 FROM node:14 AS build-frontend WORKDIR /app COPY web/package.json ./ COPY web/package-lock.json ./ RUN npm install COPY web ./ RUN npm run build # 使用Nginx提供前端静态文件 FROM nginx:alpine COPY --from=build-frontend /app/dist /usr/share/nginx/html COPY web/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 然后在docker-compose.yml中添加前端服务。 四、操作步骤总结 1. 创建项目目录,并组织好文件: - 后端项目代码(包括pom.xml) - 前端项目代码(在单独的目录,如`web`) - 编写后端Dockerfile(放在后端项目根目录或指定位置) - 编写前端Dockerfile(放在前端项目根目录) - 编写docker-compose.yml(放在项目根目录) 2. 在docker-compose.yml中配置服务(如上面的示例)。 3. 运行命令: ```bash # 在docker-compose.yml所在目录执行 docker-compose down # 如果之前有运行,先停止 docker-compose up -d --build # 重新构建并启动 ``` 4. 如果遇到Maven构建问题,检查Maven镜像源,可以在Dockerfile中构建阶段添加镜像设置: ```Dockerfile RUN mvn clean package -DskipTests -s /path/to/settings.xml ``` 或者将settings.xml复制到容器中。 5. 如果前端构建失败,检查前端目录结构是否正确,以及Dockerfile中复制的路径。 五、注意事项 - 确保docker-compose.yml中的卷挂载正确,避免覆盖容器内的关键文件。 - 环境变量在docker-compose.yml中设置,并在应用配置中引用(如Spring Boot的application-prod.yml中可以使用`${DATABASE_PASSWORD}`)。 - 如果使用私有仓库,需要配置Docker的daemon.json(如引用[2]所示)。 六、调试技巧 如果容器启动失败,可以查看日志: ```bash docker-compose logs -f jeecg-boot ``` 如果构建失败,可以单独构建某个服务: ```bash docker-compose build jeecg-boot ``` 进入容器检查文件是否存在: ```bash docker-compose exec jeecg-boot sh ``` 七、生成相关问题 根据用户的问题,我们生成了以下相关问题:</think>以下是针对 Docker Compose 部署 JEECG Boot 应用时常见问题的完整解决方案,包含配置修复、Maven 和 npm 问题的排查步骤: ### 一、Docker Compose 配置修复 **问题原因**:直接在终端输入 YAML 格式内容会被识别为命令,需写入配置文件 1. **创建正确的 `docker-compose.yml`**(参考引用[3][5]) ```yaml version: '3.8' services: jeecg-boot: build: context: . # Dockerfile 所在目录 dockerfile: Dockerfile image: jeecg-boot:latest ports: - "8888:8080" # 主机端口:容器端口 environment: - SPRING_PROFILES_ACTIVE=prod - APP_LOG_LEVEL=DEBUG - DATABASE_URL=jdbc:mysql://mysql:3306/jeecg depends_on: - mysql deploy: resources: limits: cpus: '2.0' memory: 2G mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: custom_pass MYSQL_DATABASE: jeecg volumes: - mysql-data:/var/lib/mysql ports: - "3307:3306" # 外部访问端口 volumes: mysql-data: ``` 2. **创建 `.env` 全局变量文件**(参考引用[3]) ```env # 数据库配置 MYSQL_ROOT_PASSWORD=custom_pass MYSQL_DATABASE=jeecg # 应用配置 SERVER_PORT=8888 SPRING_PROFILES_ACTIVE=prod ``` ### 二、Maven 插件找不到问题解决 **问题原因**:构建环境缺少 Maven 依赖或私服配置错误 1. **在 Dockerfile 中配置 Maven 镜像源**(参考引用[4]) ```dockerfile FROM maven:3.8.6-openjdk-17 AS build WORKDIR /app # 配置阿里云镜像 COPY settings.xml /root/.m2/ # 私服配置 COPY pom.xml . RUN mvn dependency:go-offline -B COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:17 COPY --from=build /app/target/*.jar /app.jar CMD ["java", "-jar", "/app.jar"] ``` 2. **创建 `settings.xml` 私服配置**(参考引用[4]) ```xml <mirror> <id>aliyun</id> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>central</mirrorOf> </mirror> ``` 3. **重建 Maven 缓存**: ```bash docker-compose build --no-cache jeecg-boot ``` ### 三、npm package.json 不存在问题解决 **问题原因**:前端代码未正确复制到容器或路径错误 1. **修改 Dockerfile 包含前端构建**(参考引用[5]) ```dockerfile # 前端构建阶段 FROM node:16 AS frontend WORKDIR /app-web COPY web/package*.json ./ RUN npm install COPY web ./ RUN npm run build # Java 后端构建阶段 FROM maven:3.8.6-openjdk-17 AS backend ... COPY --from=frontend /app-web/dist /app/src/main/resources/static ``` 2. **确保目录结构正确**: ``` 项目根目录/ ├── docker-compose.yml ├── .env ├── Dockerfile ├── settings.xml # Maven配置 └── web/ # 前端代码 ├── package.json └── src/ ``` ### 四、完整部署流程 ```mermaid graph TD A[准备配置文件] --> B[docker-compose.yml] A --> C[.env] A --> D[Dockerfile] A --> E[settings.xml] B --> F[启动服务] C --> F D --> F E --> F F[ docker-compose up -d ] --> G[验证服务] ``` 1. **启动命令**: ```bash # 停止旧服务 docker-compose down --volumes --rmi local # 重建并启动 docker-compose up -d --build ``` 2. **验证服务状态**: ```bash # 检查容器日志 docker-compose logs -f jeecg-boot # 检查环境变量 docker exec jeecg-boot printenv | grep DATABASE # 检查端口映射 docker ps --format "table {{.Names}}\t{{.Ports}}" ``` ### 五、常见问题排查 | 问题现象 | 解决方案 | |---------|---------| | `no configuration file provided` | 确保在 `docker-compose.yml` 同目录执行命令 | | `npm: command not found` | Dockerfile 中正确安装 Node.js 环境 | | `Maven plugin not found` | 检查 `settings.xml` 镜像配置是否正确 | | 数据库连接失败 | 验证 `.env` 和 `docker-compose.yml` 的密码一致性 | | 端口冲突 | 修改 `ports` 左侧主机端口(如 `- "8888:8080"`) | > **重要提示**:首次构建时建议增加 `--no-cache` 参数确保依赖更新: > ```bash > docker-compose build --no-cache && docker-compose up -d > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值