系列文章传送门:

1、build/webpack.base.conf.js

2、build/webpack.prod.conf.js

3、build/webpack.dev.conf.js

4、build/utils.js

5、build/vue-loader.conf.js

6、build/build.js

7、build/dev-server.js

8、build/check-versions.js

9、../config/index.js

下面是build/dev-server.js中相关代码和配置的说明

项目地址:https://github.com/SmileSmith(感觉不错的话帮忙打个星哈 ~)

  1. /*
  2. * npm run dev 调试执行文件,主要用于开发环境
  3. * 建议先查阅webapck.dev.conf.js ../config/index.js
  4. */
  5.  
  6. // npm和node版本检查
  7. require('./check-versions')()
  8.  
  9. var config = require('../config')
  10. // 下面表示如果如果没有定义全局变量NODE_ENV,则将NODE_ENV设置为"development"
  11. if (!process.env.NODE_ENV) {
  12. process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
  13. }
  14.  
  15. var opn = require('opn') // opn插件是用来打开特定终端的,此文件用来在默认浏览器中打开链接 opn(url)
  16. var path = require('path')
  17. var express = require('express') // nodejs开发框架express,用来简化操作,可以当做一个功能强大的http-server
  18. var webpack = require('webpack')
  19. var proxyMiddleware = require('http-proxy-middleware') // http中间代理插件,此插件是用来代理请求的只能用于开发环境,目的主要是解决跨域请求后台api
  20. var webpackConfig = process.env.NODE_ENV === 'testing'
  21. ? require('./webpack.prod.conf')
  22. : require('./webpack.dev.conf')
  23.  
  24. // default port where dev server listens for incoming traffic
  25. // 下面是express监听的端口号,因为没有设置process.env.PORT,所以下面监听的就是config.dev.port即8080
  26. // 需要自定义设置端口号,可以修改根目录下的package.json中的dev脚本,加上 set PORT=端口号&&
  27. var port = process.env.PORT || config.dev.port
  28. // automatically open browser, if not set will be false
  29. // 默认打开浏览器,!!强制转成Boolean值,防止后续用到这个变量的地方可能出问题
  30. var autoOpenBrowser = !!config.dev.autoOpenBrowser
  31. // Define HTTP proxies to your custom API backend
  32. // https://github.com/chimurai/http-proxy-middleware
  33. // 配置反向代理的配置数据
  34. var proxyTable = config.dev.proxyTable
  35.  
  36. // 创建express实例
  37. var app = express()
  38. // ※※※ Use express.Router to mock api by SmileSmith ※※※
  39. // ※※※ 用express的router方法来mock发布一些资源 ※※※
  40. var mockRoutes = express.Router()
  41. mockRoutes.post('/getCurrentPeroid', function (req, res) {
  42. res.json({
  43. errno: 0 ,
  44. data: require('../mock/data.currentperoid.json')
  45. });
  46. })
  47. app.use('/api', mockRoutes) //api开头的请求用mock数据返回
  48.  
  49. // 把配置参数传递到webpack方法中,返回一个编译对象,这个编译对象上面有很多属性,建议看webpack官方文档
  50. // 这里主要是用到里面的状态函数 如compilation,compile,after-emit这类的
  51. var compiler = webpack(webpackConfig)
  52.  
  53. // 下面是webpack-dev-middleware和webpack-hot-middleware两兄弟,这两个是黄金组合
  54. var devMiddleware = require('webpack-dev-middleware')(compiler, {
  55. publicPath: webpackConfig.output.publicPath, // 以webpack编译后的内容处理发布地址(/)的请求
  56. quiet: true // 使用friendly-errors-webpack-plugin插件这个必须设置为true,具体看wepback-dev-config.js
  57. })
  58.  
  59. var hotMiddleware = require('webpack-hot-middleware')(compiler, {
  60. log: () => {}
  61. })
  62. // force page reload when html-webpack-plugin template changes
  63. compiler.plugin('compilation', function (compilation) {
  64. compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { // webpack任何插件都可以使用这种方式,里面可以传递钩子函数,用来在插件各个阶段做特殊处理,钩子函数种类很多
  65. hotMiddleware.publish({ action: 'reload' }) // 当插件html-webpack-plugin产出完成之后,强制刷新浏览器
  66. cb()
  67. })
  68. })
  69.  
  70. // proxy api requests
  71. // 下面是代理表的处理方法,请关注../config/index.js中开发环境proxyTab中的配置
  72. Object.keys(proxyTable).forEach(function (context) {
  73. var options = proxyTable[context]
  74. if (typeof options === 'string') {
  75. options = { target: options }
  76. }
  77. app.use(proxyMiddleware(options.filter || context, options))
  78. })
  79.  
  80. // handle fallback for HTML5 history API
  81. // 使用H5的history来做返回,而不是浏览器url
  82. // 用来解决单页面应用,点击刷新按钮和通过其他search值定位页面的404错误
  83. app.use(require('connect-history-api-fallback')())
  84.  
  85. // serve webpack bundle output
  86. // 让express用上webpack输出的模块中间件
  87. app.use(devMiddleware)
  88.  
  89. // enable hot-reload and state-preserving
  90. // compilation error display
  91. // 让express用上webpack输出的热加载中间件
  92. app.use(hotMiddleware)
  93.  
  94. // serve pure static assets
  95. // 让express用上webpack输出在static中的静态文件
  96. var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
  97. app.use(staticPath, express.static('./static'))
  98.  
  99. var uri = 'http://localhost:' + port // 这个port上面提到,默认8080
  100.  
  101. //定义一个Promise用于返回,定义一个_resolve用于编译完成时的回调里面调用
  102. var _resolve
  103. var readyPromise = new Promise(resolve => {
  104. _resolve = resolve
  105. })
  106.  
  107. console.log('> Starting dev server...')
  108. // 等待模块编译完成就可以打开浏览器
  109. devMiddleware.waitUntilValid(() => {
  110. console.log('> Listening at ' + uri + '\n')
  111. // when env is testing, don't need open it
  112. if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
  113. opn(uri)
  114. }
  115. _resolve() // readyPromise就可以返回resolve
  116. })
  117.  
  118. // node.js监听端口
  119. var server = app.listen(port)
  120.  
  121. module.exports = {
  122. ready: readyPromise, // (其它人)调用ready(),就能拿到一个promise对象
  123. close: () => {
  124. server.close()
  125. }
  126. }

参考:http://www.cnblogs.com/ye-hcj/archive/2017/06.html

vue-cli脚手架npm相关文件解读(7)dev-server.js的更多相关文章

  1. vue-cli脚手架npm相关文件解读(4)utils.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  2. vue-cli脚手架npm相关文件解读(9)config/index.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  3. vue-cli脚手架npm相关文件解读(8)check-versions.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  4. vue-cli脚手架npm相关文件解读(6)build.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  5. vue-cli脚手架npm相关文件解读(5)vue-loader.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  6. vue-cli脚手架npm相关文件解读(3)webpack.dev.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  7. vue-cli脚手架npm相关文件解读(2)webpack.prod.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  8. vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  9. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...

随机推荐

  1. STL—vector空间的动态增长

    vector空间的动态增长     当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vect ...

  2. 简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  3. js模块加载之AMD和CMD

    当我写这篇文章的时候,sea.js已经逐渐退出历史的舞台,详细链接.不过任何新事物的出现都是对旧事物的取其精华,去其糟粕,所以了解一下以前模块的加载也是一件好事. js模块化的原因自不比多说,看看HU ...

  4. FreeRTOS——中断管理

    1. 只有以“FromISR”或"FROM_ISR"结束的API函数或宏才可以在中断服务函数中使用. 2. 除互斥信号量外,所有类型的信号量都可以调用 xSemaphoreTake ...

  5. USB基础知识

    Q: USB是什么? A: USB是通用串行总线(Universal Serial Bus)的缩写. Q: USB的优点有哪些? A: ① 支持热插拔:(hot-plugging或Hot Swap)即 ...

  6. Angularjs跳转切换至对应选项卡

    //跳转前页面 <div class="list user_order" ng-click="userOpen('userOrder',0)"> & ...

  7. github 发布项目

    自己开发了一个插件或项目,需要发布到github上,之前看到很多文章,但是都会有一些问题,经过自己多次尝试,想分享给初学者们. 首先你需要一个github账号,所有还没有的话先去注册吧! 官网:htt ...

  8. ASP.NET Core - Razor 页面简介

    简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...

  9. TP3.2二级导航与高亮显示

    闲来无事,记记笔记 二级导航的实现,就是一个二级联动,嗯 先来看看数据库,我喜欢用一个表,表多了就不好玩了 二级代号取一级导航的代号就行了,做个简单的栗子: 代码部分: 看控制器,大头在这: < ...

  10. 截屏工具 HyperSnap

    听说Tencent开发了1款截屏工具,叫"snip".确实字体效果不错,但是丫只有for mac的,不知道脑子里怎么想的,该不是直接买了第三方的然后冠了个名儿吧. 那么Windows有没有类似的工具呢 ...