egg-static怎么设置多个路径为静态路径

Created on 16 Mar 2017  ·  29Comments  ·  Source: eggjs/egg

请教下大神,在 config.default.js里可以设置服务器的静态文件的路径,如
config.static = {
prefix:'',
dir:path.join(appInfo.baseDir, 'app/public'),
dynamic:true,
preload:false,
maxAge:31536000,
buffer:false
};
但假如要设置多个路径都为静态文件的路径请问要怎么设置呢?

Most helpful comment

@dead-horse 错误的写法,应该这样写

exports.static = {
  dir: ['dir1', 'dir2'],
};

All 29 comments

目前 egg-static 不支持多路径,@dead-horse 看看有没有必要

@zhengcanbiao 我之前是写了一个的 https://github.com/okoala/egg-multiple-static
现在就看组织要不要默认支持了~

@okoala 你可以去给 egg-static 提 PR 支持一下

真的有必要么?为何不放在一起?或者说不是不每个项目都有这样的需求。

有额外插件支持实现特定需求就好了,框架没必要所有场景都覆盖到

挺有必要,因为后台系统和前台系统的静态文件可以分开。

后台和前台为何放在一个应用里面? 不太好吧

我现在有个项目是react的webpack构建的,那么生成的文件全在dist目录里面,dist目录不想往public里面放。而是和源码src放一起,那么就想渲染这个app.html,public里面是放普通页面的静态文件。所以想设两个静态文件目录。当然nginx可以根据路径解决,这里支持的话在开发环境比较好。

@okoala 可以提个 PR 看看吧.

@huacnlee 感觉不是很大的需求,如果能直接内建支持感觉问题也不大。

egg-view支持多个路径渲染模板,那么静态文件应该也跟上比较好啊。

自己用koa搭起来挺顺手,用框架的话就要看支不支持了,要了解各种语法,各种写法。这也是纠结要不要选框架了,当然选框架肯定是挺多好处。

@lys623 这个问题只是 egg 有没有内置而已,通过上面 @okoala 写的插件,也能解决这个问题。

嗯,是的。

@atian25 好,我今天提的PR~

@okoala 谢谢大神

@zhengcanbiao

我已经提了个PR eggjs/egg-static#7,你可以关注下,用法和 egg-view 一致。

重新安装 egg 就可以了

// config/config.default.js
exports.static = {
  dirs: ['dir1', 'dir2'],
};

@dead-horse 错误的写法,应该这样写

exports.static = {
  dir: ['dir1', 'dir2'],
};

最近我也遇到类似的需求和问题,/app/public/ 是服务端的静态文件目录,而/buildbeidou build 后的 React 文件目录,在产品发布模式,这两个目录都需要直接的静态文件服务,而 static 似乎并不支持多个目录的设置,/build目录正常,但是/app/public目录的内容就无法正常显示,报 404 错误。

后来找到目前这个 dir: [ '/app/public/', '/build/' ] 的解决方案,勉强可以尝试成功,但感觉并不好,因为对应的是同一个 prefix,这样在 URL 上同样的路径,如:/public/main.js,对应到具体哪个目录呢?如果同时存在呢?哪个会生效?如:/app/public/main.js/build/main.js

前面的讨论有提到框架是否需要支持到这么细节的功能,我个人觉得是需要的,BeiDou 框架因为默认加载了 egg-static,所以 egg-static 就应该把这件事做彻底,否则使用者还要再去安装特殊的插件,还要考虑怎么禁用掉 egg-static,或者如何能不冲突并覆盖掉它的配置等。

理想的配置应该是类似这样的:

static: [
  {
    prefix: '/public/',
    dir: '/app/public/'
  },
  {
    prefix: '/ui/',
    dir: '/build/'
  },
]

希望大家讨论一下~

@okoala 瞅瞅

Which one? 哪一个库?那是个人主页的链接啊?

找到了,是说这个 egg-multiple-static 吗? 我前面也说了,应该在 egg-static 中彻底实现了,而不应该再用额外的插件来做,存在冲突的顾虑以及要不要安装了 egg-multiple-static 后删除 egg-static 呢?

还有一种可能就是 beidou 框架直接弃用 egg-static 改用 egg-multiple-static 也行。

另外,顺便提一句,egg-multiple-static 的文档太少,只提了一句可以用所有 Koa Static Cache 的配置,但初学者还是比较迷惑的,最好能有一些代码示例,会有很大的帮助!

@wind13
https://github.com/okoala/egg-multiple-static
我很早之前弄了这个,我更新下文档吧~

@okoala 兼容 egg-static 么?

https://github.com/eggjs/egg-static/blob/master/app/middleware/static.js#L45

可以考虑直接加下类似的配置,这里的实现是可以支持的。

如果可以支持,那就希望完善一下相关文档,给一个代码示例就更好了~

@okoala 把你这个直接集成到 egg-static 吧, config.static 支持数组方式感觉就可以了。

@atian25 看了一下那段代码,可能还需要再修改一下才能支持,也许思路应该更简单一些,类似:

module.exports = (options, app) => {
    for (const opt of options) {
        middlewares.push(staticCache(opt)); // 直接转交给 Koa Static Cache 完事儿~
    }
}

当然,这个要仔细查看一下之前的代码逻辑,保留有效的部分,考虑很多细节问题,包括之前的兼容问题等,也许不是那么简单的一个任务。

PR 已提,相关进展关注 https://github.com/eggjs/egg-static/pull/17

其实一般应该都是丢 CDN 的,尽量不要在应用本身来托管静态资源。

真的有多个目录的需求的话,参考下:https://github.com/atian25/egg-showcase/pull/12

land 2.2.0

Was this page helpful?
0 / 5 - 0 ratings

Related issues

bupafengyu picture bupafengyu  ·  3Comments

Webjiacheng picture Webjiacheng  ·  3Comments

xcstream picture xcstream  ·  3Comments

Azard picture Azard  ·  3Comments

popomore picture popomore  ·  3Comments