低成本“全栈”回忆录

栏目: 编程工具 · 发布时间: 5年前

内容简介:“建站”是一个很古老的话题了,互联网有各种快速建站的小广告。相信每位开发者都有过各种倒腾的经历,随着大量平台工具的兴起,建个开发者博客什么的,早已旧时王谢堂前燕,飞入寻常百姓家。而移动端开发者学习/掌握大前端技术体系是趋势所在,了解前后端/运维等知识也多有裨益。

低成本“全栈”回忆录

“建站”是一个很古老的话题了,互联网有各种快速建站的小广告。

相信每位开发者都有过各种倒腾的经历,随着大量平台 工具 的兴起,建个开发者博客什么的,早已旧时王谢堂前燕,飞入寻常百姓家。而移动端开发者学习/掌握大前端技术体系是趋势所在,了解前后端/运维等知识也多有裨益。

在Android部门内,开发维护了一些平台工具,目前已经基本形成一套完整的工具链,既有 在线工具集 ,也有 AVM平台58APP协议平台 。在参与开发这些项目的过程中,有幸为这些不同框架体系的项目添砖加瓦。

那么如何 以较低的开发/学习成本,开发一个完整站点并上线 是这篇文章将要介绍的。

本文基于笔者的一些倒腾案例总结而来,包教不会,不正确的地方欢迎交流/指正。

0x1 项目构思

作为一枚宅男,看影视剧是一个难以割舍的爱好,英剧/美剧/韩剧都有很多吸引人的地方。

作为一枚技术宅,是不是可以自己搞一个小电影的网站/客户端?

学习研究一个东西肯定是要做一些平时做的少的东西,才有满足感;我们跳过客户端开发,定个小目标:

做一个适配手机浏览器的小网站,能展示电影列表信息,并且点击下载资源。

完成这个一句话目标,我们需要考虑的事情可以用一张图来概括:

低成本“全栈”回忆录

下面我们顺着思维脑图,逐一介绍下整个开发历程。

0x2 前端开发

首先整个网站的前端是一个独立项目。我们走的是React技术路线,通过 create-react-app 这个脚手架工具来创建前端工程。不要问我为什么,作为新手不用这个的话,大量新的框架概念术语,会让你的脑容量瞬间不够用。

这个脚手架的说明介绍也很干净利落:

  • Less to Learn
  • Only One Dependency
  • No Lock-In

低成本“全栈”回忆录

0x2.1 模板工程

成熟的框架,都会有一套模板工程,React当然不例外。它的发车姿势比较简单,真的是一个命令搞定: npx create-react-app my-app

低成本“全栈”回忆录

有了模板工程以后,就可以开始写你的业务界面了。

为了让我们的页面看起来更美观&专业,强力建议选择一个UI组件库, Bootstrap,Material UI 都可以,毕竟这是一个看脸的世界。这里我们选择的是 Semantic UI React , 长得好看还好用

0x2.2 页面开发

用react写界面,大部分工作都在构造Component,一个Component写法如下:

class SegmentExamplePlaceholderGrid extends React.Component {
  render(){
    return (<div></div>)
  }
}
export default  SegmentExamplePlaceholderGrid

如果你的Component非常简单,也不需要实现任何生命周期,只有一个基本的 render ,也可以简写。举个例子,如果要实现下面这个效果,利用Sementic UI组件,可以这么写:

低成本“全栈”回忆录

import React from 'react'
import { Button, Divider, Grid, Header, Icon, Search, Segment } from 'semantic-ui-react'

const SegmentExamplePlaceholderGrid = () => (
  <Segment placeholder>
    <Grid columns={2} stackable textAlign='center'>
      <Divider vertical>Or</Divider>

      <Grid.Row verticalAlign='middle'>
        <Grid.Column>
          <Header icon>
            <Icon name='search' />
            Find Country
          </Header>

          <Search placeholder='Search countries...' />
        </Grid.Column>

        <Grid.Column>
          <Header icon>
            <Icon name='world' />
            Add New Country
          </Header>
          <Button primary>Create</Button>
        </Grid.Column>
      </Grid.Row>
    </Grid>
  </Segment>
)

export default SegmentExamplePlaceholderGrid

“小站电影”项目,这里这里写的是一个List,展示一个电影列表:

低成本“全栈”回忆录

0x3 后端开发

前端页面有了,我们需要为页面提供数据。那么我们的服务器用什么来做呢?

为了上手快,降低门槛,可以使用Node作为后端服务器的运行环境,这样可以直接使用Node的http模块,也可以使用 express 之类的框架。

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello Express!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

类似的,我们可以开发真实的API,并且测试接口的数据返回情况。这里我们通过curl来简单测试下:

aven-mac-pro-2:~ aven$curl localhost:3001/api/movie/list/9/0 |jq .

我门的API是以json格式返回的,为了格式化看得清晰点,可以使用jq做输出。

低成本“全栈”回忆录

0x4 数据采集

按部就班,我们的接口要返回数据,但是数据又从哪里来?

接下来就是如何去找数据。互联网上资源非常多,随便找找就有一堆,这里可以考虑下pv比较大的电影天堂。

0x4.1 xposed

电影天堂上有很多免费的良心资源,还有客户端app,忽略页面比较渣,还是能用的。抓包一下可以看到他的请求情况:

低成本“全栈”回忆录

低成本“全栈”回忆录

如果我们直接请求模拟这个接口请求,会失败的,通过观察可以发现 header 里面有两个字段比较可疑:

x-header-request-imei: 89014103211118510720
x-header-request-key: e62641ff809149a261ac7db336deb399

进一步反编译app,可以知道这个 x-header-request-key 是个加密串,

public final native String headerRequestKey(Context context, String str, String str2);

下面我们就模拟一下,加入加密的自定义头:

低成本“全栈”回忆录

同时需要开发两个xposed模块,对应用进行签名拦截,hook做两件事:

  1. 获取正版应用的签名字节数据
  2. 替换测试应用的签名

低成本“全栈”回忆录

低成本“全栈”回忆录

接下来就可以开始起飞了,要注意,接口调用不要太频繁,不然ip会被封的,也不要问我是怎么知道:)

关于如何安装xposed框架,开发module不在我们的讨论范围之内,感兴趣可以去深入学习下:

de.robv.android.xposed.installer

0x4.2 网页爬虫

除了客户端破解,也可以考虑去扒一下它的网页,这样不需要反编译什么的,只需要好写好脚本去分析目标html。这个网上已经有人做过这件事情,就不再介绍,除了爬虫其实还有一个办法,去找一些资源采集器,用别人开发好的采集工具批量拉取数据。

0x5 服务器搭建

让我们回顾一下,现在数据也有了,需要考虑下一步,怎么把我们的服务和网站提供给外网用户访问,总不可能一直的本机跑吧。

如果手上有服务器的话可以直接用,不需要单独再买一个。没有的话,可以采购一台,国内的阿里云也不错,配置不用太好,选个便宜的,单核1G内存就够玩了。

1 CPU, 25G Storage, 1G RAM

为了好好利用和管理手上的机器,可以使用 docker 来部署应用,这样可以保证服务迁移和主机环境相互不影响。避免直接部署在主机上后,需要安装一堆的运行环境和依赖配置。

我们内部的平台工具目前使用的是 Portainer 来管理docker实例,使用比较简单,功能也足够强大,我的主机也采用它来管理服务。下面是portainer的官方使用案例:

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

部署完服务,就可以登陆后台管理。新增,删除,重启docker镜像都可以直接操作。

低成本“全栈”回忆录

这里我们新增了一个Node镜像,由于没有什么特殊依赖,直接使用了官方的镜像。启动镜像后,远程登陆然后可以开始你的骚操作,比如更新代码,启动脚本什么的。当然也可以把这些所有流程写入Dockerfile,构建我们自己的镜像,这样每次实例化对象,启动后不需要单独操作。

低成本“全栈”回忆录

0x6 部署上线

现在万事具备只欠东风!

分配一个域名和我们的主机ip绑定。这样广大人民群众就可以统一域名访问我们的主机。

这里需要确定docker的端口映射,让主机80端口映射到docker实例的8080端口,在docker内部,我们的网站只需要监听8080端口就可以对外提供服务了。

为甚是80而不是443或者其他接口呢?这主要是因为我没有提供https接口,80端口是http协议默认端口,浏览器都认,如此所有请求 http://io.hacktons.cn 的等同于 http://io.hacktons.cn:80

平时开发都是在本地,执行npm start就能跑起项目,如今要上线了,自然后准备一下脚本和配置,确保本地开发使用开发端口,上线使用上线端口,并且前端代码是上线的模式:

react-script为我们做了很好的封装,只需执行不同命令,带上参数配置:

"scripts": {
  "start": "react-scripts start",
  "build": "GENERATE_SOURCEMAP=false react-scripts build",
  "test": "react-scripts test --env=jsdom",
  "eject": "react-scripts eject"
}

发布的时候走build命令,不生成source map: GENERATE_SOURCEMAP=false react-scripts build

我们看到所有源码经过webpack打包之后全部混淆,集中到了几个chunk/bundle文件内置:

低成本“全栈”回忆录

后端代码由于不会暴露给前端,暂时没有什么特殊操作,只需要考虑端口号:

"scripts": {
  "server": "node server.js",
  "prod":"PORT=8080 NODE_ENV=production npm run server"
}

我们可以吧所有要做的配置固化后,写成脚本,自动/手动执行:

低成本“全栈”回忆录

0x7 总结

现在点击访问io.hacktons.cn就可以看到我们的小网页了。

讲一个段子:JavaScript是最好的语言,我不是针对PHP

:warning:本项目仅做技术研究,涉及的电影资源严禁非法下载传播。

参考

  • https://www.fullstackreact.com/articles/using-create-react-app-with-a-server/
  • https://facebook.github.io/create-react-app/docs/proxying-api-requests-in-development

  • https://github.com/facebook/create-react-app/issues/1004

  • https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md

以上所述就是小编给大家介绍的《低成本“全栈”回忆录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

奔跑吧,程序员

奔跑吧,程序员

[美]叶夫根尼·布里克曼(Yevgeniy Brikman) / 吴晓嘉 / 人民邮电出版社 / 2018-7 / 99.00元

本书以软件工程师出身的创业者的角度,全面介绍了创业公司该如何打造产品、实现技术和建立团队,既是为创业者打造的一份实用入门指南,又适合所有程序员系统认识IT行业。书中内容分为三部分——技术、产品和团队,详细描绘创业的原始景象,具体内容包括:创业点子、产品设计、数据与营销、技术栈的选择、整洁的代码、软件交付、创业文化、招兵买马,等等。一起来看看 《奔跑吧,程序员》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

SHA 加密
SHA 加密

SHA 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换