2015-12-15 95 views
2

我试图快速向客户展示基于其设备的不同网站。即移动用户可以通过移动应用和桌面用户获得网络应用。Express.compress和移动设备

这是我的代码:

var express  = require('express'), 
    app   = express(); 

app.get('/', function(req, res) { 

    var ua  = req.header('user-agent'); 
    // Check the user-agent string to identyfy the device. 
    if(/mobile|iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile|ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(ua)) { 

     console.log("mobile"); 
     app.use('/', express.static(__dirname + '/mobile-app/www')); 
     res.sendfile(__dirname + '/mobile-app/www/index.html'); 

    } else { 

     console.log("web"); 
     app.use('/', express.static(__dirname + '/web-app/www')); 
     res.sendfile(__dirname + '/web-app/www/index.html'); 

    } 
}); 

每个应用程序工作正常。但是,如果我使用Chrome网络工具更改设备,然后进行刷新,则不会加载其他设备。即如果第一个服务实例位于Web应用程序上,并且我在移动应用程序上刷新...移动应用程序将无法工作。如果第一个服务实例位于移动应用程序上,则刷新到Web应用程序意味着无法加载。

有没有关于如何更好地做到这一点的任何想法?

感谢

回答

0

它不起作用,因为app.use实际上是补充说,被执行了一个又一个中间件。因此,第一次打开网页时,您从现在开始说',服务于此目录'的公共文件。然后,当你打开另一种设备时,你会做出同样的事情。

您的节点服务器应用程序正在运行,它只是一个用于所有设备。你应该做的是根据它的设备向用户提供内容。所以它更像是发送正确的html文件(你现在正在做什么),并且从特定文件夹加载资源。你甚至可以通过文件夹动态,如:

if (mobile) { 
    res.render('template', { resourcesFolder: '/assets/mobile/ }); 
} else { 
    res.render('template', { resourcesFolder: '/assets/desktop/ }); 
} 

在那里,在你的模板(使用一些模板引擎!)这样使用它:

<img src="{{ resourcesFolder}}image.jpg" /> 

这样,您就可以轻松切换哪个图像显示,取决于您刚刚通过的resourcesFolder变量。它可以根据用户平台而有所不同。所以它依赖于客户端,而不是依赖于应用程序