关于前端:一年只要几块钱使用oss来搭建个人纯前端项目主页

不晓得有没有前端小伙伴有和我一样的困扰,想做一个纯前端展现的集体网站,或者写了一个有用的插件,想要写一个demo页面放在readme中。而后就买了1核1g的阿里云学生机,第一年还挺便宜,一百来块就搞定,然而第二年续费就要五六百块了。然而我其实也不须要一个ECS来跑脚本或者运行后端程序数据库啥的。在ECS上也仅仅是启个Nginx或者更粗犷的http-server守护过程来跑vue或者react打包后的html页面,也不须要思考SEO的事儿。还须要域名绑定服务器,各种备案。麻烦不说,是不是还总会碰到扫端口的给你来一个正告邮件。最重要的还是白瞎钱。我仅仅是想展现一个HTML啊

上面我来给大家分享一个省钱小妙招,巧用阿里云OSS来实现咱们的需要,按量付费,网站没什么访问量,几天都花不了1分钱。并且拜访还特地稳固,快。

第一步 申请域名
必须要申请一个本人的域名(如果没有绑定域名,拜访会间接变成下载),这个很简略,就是备案比拟麻烦,须要提前资料照片身份证啥的,大概须要花一个星期左右就弄好。选个偏门的顶级域名一年就二三十块。多年套餐更便宜。这个步骤就不细说了,跟着官网指引办就好了。

第二步 开明服务
登陆阿里云,进入控制台,开明OSS服务,这个不要钱。而后创立一个Bucket

次要读写权限那一项批改为公共读写,别的都依照默认的即可。
创立胜利后点击域名治理->绑定域名。将本人曾经备案好的域名填入。

第三步 上传文件
本地新建一个HTML文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试</title>
</head>
<body>
    这是测试页面
</body>
</html>

而后文件治理->上传文件->胜利后刷新->文件详情->应用自有域名->复制地址。

浏览器拜访->功败垂成

进阶
当初页面曾经能够拜访了,已vue脚手架为例,把build之后生成的dist文件夹全副上传而后点击刷新即可,而后拜访XXX.com/index.html就会发现页面曾经更新了,成了一个SPA利用,vue-router须要应用hash模式。

然而当初有一个问题,如果每次更新都要从新上传文件再刷新缓存很麻烦,次要是阿里云登陆信息维持不了很久,隔几个小时就须要从新扫码登陆。要是可能主动上传刷新部署就好了。好在阿里云团队曾经想到了这件事,应用ali-oss即可。
将你的账号的用户名、bucket、AccessKey等信息作为参数传入,能够活得以后bucket实例,具备文件的一系列新增,删除等办法。
第一步,新建一个oss.js文件,这里保留你的信息,这属于隐衷,记得igonre哦

module.exports = {
    region:'oss-cn-beijing',
    AccessKey: 'ABCDABCDABCDABCDABCD',
    SECRET: 'saaaaaaaaaaaa',
    UserName: 'xxx@xxx.com',
    bucket: 'xxxxxx',
}

第二步,咱们须要在根目录新建一个叫upload.js的文件,对build后的文件进行全量替换(因为我的我的项目十分小,所以全量,如果资源很多,须要增量替换能够自行实现)

const OSS = require('ali-oss');
const oss = require('./oss')
const recursive = require('recursive-readdir')
const fs = require('fs')
let client = new OSS({
    region: oss.region,
    accessKeyId: oss.AccessKey,
    accessKeySecret: oss.SECRET,
    bucket: oss.bucket,
});
(async function() {
    console.log('开始同步OSS=============================')
    let list = await getList();
    // 删除旧文件
    for (let i = 0; i < list.length; i++) {
        await client.delete(list[i].name)
        console.log('删除文件'+list[i].name);
    }
    // 上传新的
    recursive('dist',function (err,files) {
        files.forEach(filePath => {
            fs.readFile(filePath,async function (err, file) {
                let filename = filePath.replace('dist/','')
                await putObject(file, filename)
                console.log('上传文件'+ filename);
            })
        })
    })
})()

async function putObject (file,fileDir) {
    try {
        // object-key能够自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的模式,实现将文件上传至以后Bucket或Bucket下的指定目录。
        client.put(fileDir, file);
    } catch (e) {
        console.log(e);
    }
}
async function getList() {
    let res = await client.list()
    return res.objects;
}

最初批改一下package.json中的build命令

这样咱们每次改完bug或者上新性能之后只有yarn build一下,网页就自动更新了,是不是很不便呢。

talk is cheap,show me your code

将来拓展
目前这种部署形式属于野路子部署,最好还是走正规git的CI/CD流程。毕竟典礼感还是很重要的,即便是一只小麻雀,也要让他五脏俱全。等我有工夫实现之后再来跟大家分享。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理