打通前后端构建一个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 相关文章推荐
jQuery 版本的文本输入框检查器Input Check
Jul 09 Javascript
Javascript 面向对象 命名空间
May 13 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
Feb 07 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
老生常谈JavaScript中的this关键字
Oct 01 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
Vue Router history模式的配置方法及其原理
May 30 Javascript
详解如何从零开始搭建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
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
浅谈PHP中的
2016/04/23 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
2021/01/24 Python
凯特王妃父母建立的派对用品网站:Party Pieces
2017/05/28 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
pytorch fine-tune 预训练的模型操作
2021/06/03 Python