express + ejs 怎么配置静态服务器URL呢?
发布于 8 年前 作者 loft218 5122 次浏览 来自 问答

如题,如果是express设置静态目录,这下面语句即可 app.use(express.static(__dirname + ‘/public’));

但是我的项目中静态资源是另外一个独立项目,也就是说我需要通过 http:// 绝对路径去引用。

对于EJS模板中,我要如何去引用呢? 当前项目中的静态目录引用 <link rel=“stylesheet” href="/style.css" /> 不在当前项目的绝对地址呢?

我需要可配置的,因为开发测试和生产环境配置会不同。

不会在每个router时render吧。。。 有没有可行的方案呢?

简单来说,在ejs模板中我要如何对静态资源http路径进行统一配置? <link rel=“stylesheet” href=“http://server-domain/static/…/style.css” /> 如何实现 http://server-domain/static/… 配置

9 回复

你要可配置就把该参数写在配置文件里吧,然后每次渲染模板都把配置信息传进去就好啊

@ncuzp 你的意思是每次都 render config配置? 有没有更好的方案呢?

@loft218 如果你要通过ejs模板传参配置的话,只能每次都render config~, 或者你改写下ejs, 然后给它配置个默认数据源, 这个想法也是可以的哈哈,不过你要考虑维护了~

var path=require(‘path’); if(process.env.YOUR_ENV==‘production’){ var STATIC_PATH=path.join(__dirname+’…/pubic’); }else{ var STATIC_PATH=path.join(__dirname+’…/…/public’); }

app.use(express.static(STATIC_PATH));

类似这样,不知是不是楼主要的效果

如果你得资源在另一个服务器,干嘛不配一个全局配置启动时根据env值写进global里,然后ejs里 href=<%= global.**** %>

可能楼主想把静态资源放到服务端项目外吧,大概类似这样 your_project_w |_ views |_ inlucde |_ head.html |_ index.html |_ login.html |_ web |_ js |_ css |_ img |_ web_dist |_ pro |_ index.min.js |_ index.min.css your_project_s |_ logs |_ models |_ user.js |_ routes |_ user.js |_ package.json |_ app.js 如果是这样的话,你可以设置: // 环境: pro/dev var status = ‘dev’; app.set(‘views’, path.join(__dirname, ‘…/your_project_w/views’)); app.use(express.static(path.join(__dirname, status == ‘dev’ ? ‘…/your_project_w/web/’ : ‘…/your_project_w/web_dist/’);

app.use(function(req, res, next) { res.locals.env = status; next(); });

第一个放views,第二个放静态资源; 不过,前提是你的另外一个项目的要和node服务端项目在同一个服务器内; 对于可以配置,在views/include的head.html,可以这样写: <% if(env == ‘dev’){ %> <link href=‘css/index.css’ rel=‘stylesheet’ type=‘text/css’ />

<% }else{ %>

<link href=‘pro/index.min.css’ rel=“stylesheet” type=‘text/css’ />

<% } %>

可以用nginx做静态资源映射,很方便,可以达到你要的目的

来自酷炫的 CNodeMD

@muzi131313 @fantasticsoul 两位的方案适用于资源和项目在一个服务器上,我的场景是分别在不同服务器上,资源需要通过nginx转发 我已找到一个解决方案: //全局设置res的locals属性 app.use(function(req,res,next){ res.locals.staticUrl = ‘http://baseurl’ });

在ejs页面 <%= staticUrl/css/style.css %>

这样不用在每个route的时候去render数据对象

又一个模块叫co-ejs

回到顶部