打通前后端构建一个Vue+Express的开发环境


Posted in Javascript onJuly 17, 2018

前端做多了,自然就会想往后端伸手。更何况现在有了Node和Express,让前端做后端开发的学习降低了不少。

最近正好揽下了一个 Vue + Express + mysql 的小项目。项目开始时是前后端分开开发的,但是当后台做好一部分要进行连接测试时问题就来了。前端部分在每次修改过就需要build一次,而后台也每次需要重启一次服务器才能进行调试。可想而知,这样的开发和调试效率是很低的。在这么煎熬着做了一个功能之后,实在受不了。于是便想有没有什么方法可以热更新开发前后端。毕竟 vue-cli 在调试时,后台就是用 express 做的服务器。

在网上搜索了一下,发现果然有前辈们已经想到这个问题,并做了一个 Vue + Express 的开发环境。

可以参考这篇文章:从零开始搭建 Express + Vue 开发环境

原理的话可以参考这篇文章,主要就是通过修改 webpack 的配置文件来达到同时开发前后台的目的。于是果断去 Fork 了作者在 Github 上的项目。 clone 下来运行之后发现,虽然热更新是没有问题了,但是对于前端 Vue 的部分来说,由于没有build,因此是无法打包变为生产环境的。那么为了走完这一步,便自己动手对项目进行了改造。

改造后的版本: 可 build 版 Vue + Express 开发环境 求个Star也欢迎批评指教

打通前后端构建一个Vue+Express的开发环境

改造后目录

其中关于 webpack 的配置,没有使用原项目的配置文件,而是几乎将 vue-cli 生成的项目的配置文件都拷过来使用的。
这里需要注意的是,下面几个配置文件的所引用的位置变更一下即可。

server/index.js

这是 express 服务器的入口,在这里需要修改的地方主要有两个。引用 webpack 配置文件的路径,以及静态页面的设置。

import express from 'express'
import path from 'path'
import favicon from 'serve-favicon'
import logger from 'morgan'
import cookieParser from 'cookie-parser'
import bodyParser from 'body-parser'
import webpack from 'webpack'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpackHotMiddleware from 'webpack-hot-middleware'

import config from '../../build/webpack.dev.conf' //这里指向 vue-cli 拷贝过来的配置文件

const app = express()

// view engine setup 模板文件,根据具体情况添加
// app.set('views', path.join(__dirname, 'views'))
// app.set('view engine', 'jade')

// uncomment after placing your favicon in /public
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
app.use(logger('dev'))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public')))

const compiler = webpack(config)

app.use(webpackDevMiddleware(compiler, {
 publicPath: config.output.publicPath,
 stats: { colors: true }
}))

app.use(webpackHotMiddleware(compiler))
// 引用最后的静态文件
app.use(express.static(path.join(__dirname, 'views')))
app.get('/', function (req, res) {
 res.sendFile('./views/index.html')
})

app.listen(4000)

export default app

webpack.dev.conf.js / webpack.prod.conf.js

这两个文件中,也只要修改一下最后代码注入的模板的路径即可。以 webpack.dev.conf.js 为例。

var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
 baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})

module.exports = merge(baseWebpackConfig, {
 module: {
  rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
 },
 // cheap-module-eval-source-map is faster for development
 devtool: '#cheap-module-eval-source-map',
 plugins: [
  new webpack.DefinePlugin({
   'process.env': config.dev.env
  }),
  // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
  new webpack.HotModuleReplacementPlugin(),
  new webpack.NoEmitOnErrorsPlugin(),
  // https://github.com/ampedandwired/html-webpack-plugin
  new HtmlWebpackPlugin({
   filename: 'index.html',
   // 这里的路径需要重新指定为现在的路径
   template: 'src/server/views/index.html',
   inject: true
  }),
  new FriendlyErrorsPlugin()
 ]
})

因为是按照 vue-cli 生成出的目录来拷贝的,因此其余的文件都不需要做任何的修改。

接下来只要试着运行一下就可以了。

运行开发模式:

npm run dev

打包前端代码:

npm run build

打包完之后,只要稍微修改一下 express 启动的 js 文件就可以变为正式上线的版本了。如此一来,就能很轻松愉快地进行全栈的开发了。个人感觉至少可以提高30%吧。所以各位不来试一试吗?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
js实现简单的计算器功能
Jan 16 Javascript
Vue框架之goods组件开发详解
Jan 25 Javascript
vue中如何实现pdf文件预览的方法
Jul 12 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
Oct 30 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
Vue管理系统前端之组件拆分封装详解
Aug 23 Javascript
如何在JavaScript中正确处理变量
Dec 25 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
详解如何从零开始搭建Express+Vue开发环境
Jul 17 #Javascript
微信小程序自定义组件之可清除的input组件
Jul 17 #Javascript
微信小程序倒计时功能实例代码
Jul 17 #Javascript
详解vue+webpack+express中间件接口使用
Jul 17 #Javascript
微信小程序实现默认第一个选中变色效果
Jul 17 #Javascript
Vue2.X 通过AJAX动态更新数据
Jul 17 #Javascript
浅谈Angularjs中不同类型的双向数据绑定
Jul 16 #Javascript
You might like
学习php分页代码实例
2013/10/24 PHP
php实现的通用图片处理类
2015/03/24 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
js no-repeat写法 背景不重复
2009/03/18 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
vuex与组件联合使用的方法
2018/05/10 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
python使用pil生成图片验证码的方法
2015/05/08 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
基于Django用户认证系统详解
2018/02/21 Python
python使用matplotlib画饼状图
2018/09/25 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
Python实现最常见加密方式详解
2019/07/13 Python
python 自动识别并连接串口的实现
2021/01/19 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
初二学习计划书范文
2014/04/27 职场文书
学校周年庆活动方案
2014/08/22 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
windows安装python超详细图文教程
2021/05/21 Python