一个完整的express结合webpack的项目结构

2018-11-07  本文已影响0人  卧江流

首先附上项目地址(https://github.com/catyee/express-webpack.git)

项目初衷
项目结构
frame.png
使用supervisor监测文件修改自动重启
script.png
-w 后面是要监控的文件夹或js文件,
-e 后面是要监控的文件扩展名默认是node,js

为了使项目结构更加清晰,我把pc的资源和mobile的资源分别放置在了不同的文件夹中,pc和mobile下同一页面我采用了同一命名,为了便于在webpack进行编译时读取入口文件和打包到对应的文件夹,我在package.json的scripts里面分别对pc和mobile下的资源进行开发过程中的start和和开发结束后的production。production是将文件进行webpack发布模式下的编译,编译之后文件会打包到public文件夹中,我这种方式,需要在发布代码之前,分别执行npm run production-pc和production-mobile命令,进行两次编译。

开发模式下的webpack无刷新更新

使用webpack-dev-middleware和webpack-hot-middleware实现浏览器的无刷新更新。

   var hotMiddlewareScript = 'webpack-hot-middleware/client';
   entry[file] = [filePath + '/'+file+'/app.js',hotMiddlewareScript];

参考代码如下:(根目录app.js)

if (isDev) {
 var webpack = require('webpack'),
     webpackDevMiddleware = require('webpack-dev-middleware'),
     webpackHotMiddleware = require('webpack-hot-middleware'),
     webpackDevConfig = require('./build/webpack.config');
 var compiler = webpack(webpackDevConfig);
 app.use(webpackDevMiddleware(compiler, {
   publicPath: webpackDevConfig.output.publicPath,
   noInfo: true,
   // 这里强制将html文件写入(需要为编译后的html文件设置模板引擎)
   writeToDisk: (filename) => {
     return /\.html$/.test(filename)
   },
   stats: {
     colors: true
   }
 }))

 app.use(webpackHotMiddleware(compiler));
 require('./routes/app')(app);
} 
    app.use(express.static(path.join(__dirname, 'public/pc')));
    app.use(express.static(path.join(__dirname, 'public/mobile')));
    // 引用相应的路由文件
    require('./routes/app')(app);
路由及模板引擎的设置
model.getPositions = function(callback) {
    return axios.get(model.baseUrl + 'rest/position/page', {
        params: {
           
        }
    }).then(response => {
        if(response.data.code === 200){
           // ...
        }
        callback && callback();
    }).catch(e => {
        callback && callback();
    });
}
router.get('/', function (req, res, next) {
    model.getNewsList();
    next();
}, function(req, res, next) {
    if (isMobile(req)) {
        res.render(mobileViewPath + '/index', { baseMsg: model.baseMsg, allNews: model.allNews});
    } else {
        res.render(viewPath + '/index', { baseMsg: model.baseMsg, rollNewsList: model.rollNewsList });
    }
});
// view engine setup
app.engine('html', ejs.__express);
app.set('views', path.resolve(__dirname, 'public/pc/views'));
app.set('views', path.resolve(__dirname, 'public/mobile/views'));
app.set('view engine', 'html');

这里有一个问题就是使用"html-webpack-plugin",在template选项中默认template使用ejs模板引擎,这样的话在views文件夹中写ejs模板引擎会直接被渲染,并且我们设置的路由渲染页面是public中的html,所以在views中会拿不到服务端传递数据而报错,我这里修改了template的模板引擎为handlebars,这样的话在webpack编译的时候就会默认忽略掉ejs代码,在public中保留了ejs代码

       let opts = {
        inject: 'body',
        filename: 'views/'+file + '.html',
        template:'handlebars-loader!'+(templatePath + file + '.html'),
        chunksSortMode: 'manual',
        chunks: [file],
        hash: true,
    }

webpack的配置这里就不说了,都是一些常规的配置。

使用pm2及nginx进行部署
   upstream test {
       server 127.0.0.1:3000;
       keepalive 64;
   }
   server {
       listen 80;
       server_name aaa.XXX.com
       root /data/www/home/dwt-gw;
       location / {
         # Proxy_pass configuration 
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
         proxy_set_header Host $http_host; 
         proxy_set_header X-NginX-Proxy true; 
         proxy_http_version 1.1; 
         proxy_set_header Upgrade $http_upgrade; 
         proxy_set_header Connection "upgrade"; 
         proxy_max_temp_file_size 0; 
         proxy_pass http://test/; 
         proxy_redirect off; 
         proxy_read_timeout 240s; 

       }
   }

然后启动nginx,根据所配置的server_name就可以访问相应项目了

上一篇下一篇

猜你喜欢

热点阅读