美文网首页前端Vue专辑前端开发笔记让前端飞
打通前后端 -- 构建一个 Vue + Express 的开发环

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

作者: 吃土的小此方 | 来源:发表于2017-07-29 22:59 被阅读16924次

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

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

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

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

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

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

    改造后目录

    其中关于 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%吧。所以各位不来试一试吗?

    相关文章

      网友评论

      • 0897e4e2dc9a:执行npm run dev直接出现“nodemon”不是内部或外部命令
      • 路人丁0417:想问下博主,如果是多个入口该怎么配置啊?
      • a234dc831263:大佬,我要用vux要怎么改webpack呀?
      • ff21859a7f9e:不是很明白,单一入口,后端怎么进行开发呢,全部写成接口,后端界面交由前端路由进行跳转吗,可否帮忙解答解答。
        吃土的小此方:@后青春期的诗_08a6 后端只要提供数据就行。不用管前端页面怎设计。
      • 0c45406e8da8:文章内容挺不错的。我们侠课岛工作是远程录制课程视频或图文教程,我们会给到课程的需求大纲,每一节课程需要你来详细展开写一些代码举例和讲解清楚,对经验积累和创新能力有一定的要求,有兴趣可以联系我。加我微信:zhimadt
      • tly:npm run dev报错:
        (function (exports, require, module, __filename, __dirname) { import express from 'express';
        ^^^^^^
        SyntaxError: Unexpected token import

        博主有报这个错嘛
        吃土的小此方:@tly 这个应该ES6不认的问题,用babel转一下就好
      • ybrelax:博主,请问一下,npm run build打包之后,应该是只打了前端的包吧,后端的包怎么打,还是不需要,我直接上传到服务器就ok了?
        吃土的小此方:@波_05db 这个目录其实在哪问题都不大。以Express为例的话,只要把静态文件夹指向编译后的dist目录就行,请求根目录时发送index.html就行了。具体放哪个目录是很随意的。
        相关的你可以看一下express的sendfile的用法
        ybrelax:@吃土的小此方 还想请问一下,这个后端的文件的处理方式是直接扔到服务器上,不像Java那样打个war包之类的。但是这里的代码结构是分为client和server。这个地方还需要坐下分离吗?只留下server上传?也就是我把打包好的前端文件放在服务器.那这个打包好的文件要放在什么目录下呢?还是放在原项目的dist下?不像tomcat那样直接扔到webapp下就可以了
        吃土的小此方:@波_05db 对的,只打包了前端。
        后端的话要自己处理了,不打包也没事
      • weijuer:这个后台接口在哪边写啊,为什么定义的api都时跳同一个页面
        吃土的小此方:@weijuer 你前台router有配置吗?你直接在浏览器上输入地址是没用的,会返回404
        weijuer:@吃土的小此方 router.get('/api/blogList', (req, res) => {
        console.log('Time:', Date.now());
        res.json({
        errno: 0,
        data: blogList
        })
        });
        比如这个接口 想返回列表页 前台显示404
        吃土的小此方:@weijuer 后台的接口在server里面写,跳转的话请参照前端路由的相关文章。和以前的后端跳转不一样,现在后端只是做数据的发送而已。
      • 398644b42565:楼主,小白请教一下,我run dev之后,为什么输入localhost:4000/任何地址 都是返回的前端初始页面,也没有404也没有其他的
        重写app.get('/',func)也不起作用。。。
        吃土的小此方:@姜维_8f85 这是vue-router的关系。因为是单页应用,其实服务端真正返回的是index.html,其他都是靠前端路由进行跳转的。在这个例子里面index.html就是App.vue这个内容,你可用通过控制台看一下response。如果你需要404页面,就需要重新写一下vue-router的路由匹配。
        398644b42565:@吃土的小此方 是的,我有看到用iview,报错是iview没有引入,我添加进了package.json,然后就没有报错了。之后出现了上述问题。
        尝试了npm i iview --save仍然存在问题~~
        吃土的小此方:是不是有报错信息呢?
        这个模板我后面根据自己的工作需要有修改过,添加了iview的框架。
        所以如果有报错的话,请先 npm i iview --save 之后再试着运行一下。
        如果你要使用element-ui的话,可以看一下这位同学的
        https://github.com/LuckyStarry/vue-express-dev-boilerplate
      • 130d8e33ee96:不是跨域没用而是配置没有被读取。。。。
      • 130d8e33ee96:你好,我试了一下你的框架是可行的,然后我就把我的代码填进去了。结果发现我的跨域(proxyTable)那块没有效果了。请问是怎么回事呢?
      • 697e9dd45834:大神,最后说,稍微修改一下express 启动的 js 文件就行,修改些什么呢,能详细讲一下吗
        吃土的小此方:@完全_搞不懂 :joy: 嗯嗯,我最近正打算再修改一个版本……这个版本bug太多实在抱歉
        57d79d3ea1a3:大神可不可以把部署需要更改的代码和步骤写一下,小白一枚,现在已经晕了
        吃土的小此方:这个是作为正式上线版使用的。
        现在包里的express的index.js,是做开发用的,加载了webpack中间件等用于调试的模块。
        所以这一部分的内容就需要注释掉,并且把index.html设为最终编译的dist底下
      • 今天又不想上班:本来想跟着你的思路自己搭一个,然而一直报错,最后只能拿你的框架往里填了:joy:
      • 穆風:不是有vue-cli么
        吃土的小此方: @穆風 这个就是在vue-cli上修改的,可以前后台同时开发

      本文标题:打通前后端 -- 构建一个 Vue + Express 的开发环

      本文链接:https://www.haomeiwen.com/subject/gmookxtx.html