设为首页 收藏本站
查看: 820|回复: 0

[经验分享] vue-cli脚手架build目录中的dev-server.js配置文件

[复制链接]

尚未签到

发表于 2017-12-8 13:51:57 | 显示全部楼层 |阅读模式
// 导入check-versions.js文件,并且执行导入的函数,用来确定当前环境node和npm版本是否符合要求  // 关于check-versions请查看我博客check-versions的相关文章
  require('./check-versions')()
  // 导入config目录下的index.js配置文件,此配置文件中定义了生产和开发环境中所要用到的一些参数
  // 关于index.js的文件解释请看我博客的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,具体看我的wepback-dev-config.js
  })
  var hotMiddleware = require('webpack-hot-middleware')(compiler, {
  log: () => {} // 使用friendly-errors-webpack-plugin插件这个必须设置为true,具体看我的wepback-dev-config.js
  })

  // force page>  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422136-1-1.html 上篇帖子: python socket server源码学习 下篇帖子: Sql Server 2016 Always On集群搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表