前端项目应该如何部署

一个标准的前端项目,必定始于yarn start,它将会经历babel编译,webpack构建,server启动等流程,然后由浏览器加载页面。这是很Dev的开发方式,可生产环境我们却往往不这么做。

1.何为前端?

如果按照以前的看法,前后端最本质的区别当然是运行环境了,一个是浏览器中所写即所见的UI界面,另一个则是藏在背后的服务。

在这种简单的区分下,前端往往会被定义为HTML/CSS/Javascript。没错,前端就是这些东西,这就是浏览器所需要呈现的;可也不能只有这些东西:前端有时也需要自己的后端server来充当API的中间层,也需要数据存储(如localStorage, sessionStorage, indexedDB...),甚至JS也快支持多线程了。所以现今,绝对不能用语言运行时(别给我说JS只在浏览器内运行)或者某项技术(ESX已经在草案了)来去定义前端。

个人认为,最简单的区别方法就是用API来划分:API的处理方如果在Node.js端,那么这个JS项目绝对就是后端(Node端如果只作为中间层转发则不算数);否则,如果只是作为API数据的请求方,并且有UI展现,就算是前端了。

2.有无server?

为什么要浪费篇幅去讲前端的定义,就是因为只有明确定义好前端之后,才能解决一个问题:前端到底要不要server?,因为它很大程度上决定了如何部署。

一般的前端项目都会有dist产出,通常是由一个index.html, 多个vendor.js和其他类似图片字体等资源构成。

那么这个产出物是如何被render出来的呢?

  • Case1: 利用webpack server

以下为webpack配置启用webpack server的片段:


var path = require('path');
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  devServer: {
    contentBase: path.join(__dirname, "dist"),
    compress: true,
    port: 3000,
    watchOptions: {
      poll: true
    }
  }
};

这种case显然只是render静态的html和资源,因此webpack server只在开发使用,生产则根本不需要。

  • Case2: 利用静态服务器

其实和case1类似,如果只是render静态html,那么利用类似Python:


$ python -m SimpleHTTPServer 3000

或者Nginx做代理都是很方便实现的。

  • Case3: 不必要的Node服务

var express = require("express");
var path = require('path');
var project = require('../project.config');

const app = express();
app.use('*', function (req, res) {
  const file = path.resolve(project.basePath, project.outDir, 'index.html');
    res.sendFile(file);
});

app.listen(process.env.PORT || 3000, function () {
  console.log("Listening on port %d!", this.address().port);
});

如上,只是借用Node服务去render产出物,并未做其他任何请求处理,其实和case2,3没有本质区别。

  • Case4: 将Node服务作为API中间层

router.route('/articles/send')
  .post(async (req, res) => {
    const {params} = req.body;
    const requestUrl = '/x/x/x/x';
    const response = await requestArticle(requestUrl, params);
    res.status(200).send(response).end();
  });

这种情况下,Node服务就必须存在,因为很有可能真正的API处理方不支持跨域,或者有身份验证,那么就得在这里去处理,生产环境自然也得有。

  • Case5: Node端有完善的RESTful API

这种情况下,已经可以定义为一个前后端项目了,只是恰好前后端的语言一样,并且可以共用大部分模块。

参考如上,你的项目,属于哪种情况呢?

3.如何部署?

终于到了正题,其实部署无非就是运行环境(server)+资源(包),因此才需要搞清楚你的项目到底需不需要server?,更确切的说是你的项目的生产环境到底需不需要server?,从而决定如何部署。

  • 对于case1,2,3:

可以选择任意静态服务器,运行在生产环境,每次部署只需拉取最新的代码或生成最新的包。如果需要多机部署,则推荐docker的node或nginx镜像,server只作一层简单的router和render,并将最新的源码打包在内即可。

体总来说这种情况是最简单的case,一个静态服务器就可以,想练手的可以利用Github Page去玩玩。

  • 对于case4,5:

单机环境建议有部署脚本(如ansible,去初始化各种环境依赖);多机部署则考虑node镜像,每次部署时都把代码打进镜像,并且设置启动命令,最后的部署方式就是一键部署

BTW,对于这种case,如果部署时就是多机的情况,倒不如一劳永逸,开发环境直接用docker。但开发和生产还有点区别:建议开发时不要把源码打进镜像,毕竟代码总是在变,可以将代码作为VOLUMN每次加载上去,然后手动启动,如下片段:

Dockerfile:


FROM node:7.2

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb http://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn

WORKDIR /app

VOLUME /app

只依赖Node服务和yarn。

Run docker:


docker run --rm -v [your path]:/app -ti -p 3000:3000  image:version /bin/bash

只需将代码挂载上去即可,完全的环境代码分离模式。

4.写在最后

说了这么多,给想实践的朋友推荐以下资源:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 文:森林树 元宵节,团团圆圆的日子。虽然因为住在宿舍条件比较艰苦,但是我和朋友们还是热热闹闹地做了一大桌菜,一起八...
    森林树阅读 864评论 0 1
  • “做一个有趣的人。” 在一个普通的夜晚,莫小凡发了这条朋友圈,配图是自己半年前在东南亚的海边拍的风景照。随后,她把...
    茶茶的平行世界阅读 388评论 0 1
  • 20年的时光匆匆而过,有太多的感受。想说的不想说的,都不知道该咋么表达。既然伤害了过去,就别辜负了未来。感谢父母给...
    幸福给你看阅读 350评论 0 0