开发环境

开发态目录结构类似:

然后用express的static,将上下文映射到static那级目录上,比如访问:

http://ip:5000/employee/employeeList.html

就可以加载到,并不需要输入http://ip:5000/employee/static/employeeList.html

package.js是该模块的出口,如果别的模块依赖该模块,就require它,比如

require("employee/package").employeeList;

可以看到,这里同样也不需要加上static。至于模块内部的依赖,用相对标识就比较好

require("./employeeList");

总的来说,个人建议模块内部的依赖用相对标识,跨模块的依赖用顶级标识

但是上面这种方式(直接映射到static,而不是employee)会有一个问题,就是js文件用grunt-cmd-transport提取依赖以后,模块ID一定会根据真实的路径提取(除非写代码遍历生成idleading,那会很麻烦),即会变成

define("employee/static/package", [], function(require, exports, module){
});

然后又由于seajs规定的“路径即ID规则”,合并后的文件一定要放在employee/static/package.js下,这样前面说的

require("employee/package");

就加载不到了,这个问题可以通过在grunt transport时,增加alias参数来解决,会自动修改require()里的代码

生产环境

生产环境的目录结构类似:

可以看到,seajs的模块单独放到了新增的sea_modules目录下,这个目录在开发态是没有的。主要是为了保持module_id和物理路径的一致,比如都是employee/static/package.js

同时,每个模块下的目录结构也缩减了一层,去掉了static,因为在生产环境,server端的代码已经被拿走了,就没有必要再单独区分static了。而且这样URL也会比较好,比如通过:

http://ip:80/employee/index.html就可以访问到,不需要输入http://ip:80/employee/static/index.html

总的来说,希望达到的效果是:

1. 开发的时候可以分模块来开发,不同的人负责各自的模块,在模块内部区分开static和server

2. 开发态和生产环境的路径一致,代码不需要修改,就可以在开发态和部署态同时跑起来,方便开发,容易部署

3. 生产环境的目录结构层级要浅一点,不要在URL里写static

解释

只所以会这么复杂,也有很多原因:

1. 如果生产环境不去掉static,那就没后面的问题,但是这样URL里就要加上static,很不方便,所以生产环境的目录结构里不能有static这一层,而开发态又必须要有(才能跟server区分开)

2. 既然两边的目录结构不一致,就要想办法统一URL,不然就会有很多问题。比如通过$router找html的时候,开发环境和生产环境的URL就要区分开,增加了复杂度。再比如我们的CSS里有.png的地址,路径不一致的话就只有一边能找到。所以想到的办法,就是把开发环境静态文件绑定到static那一层上,而不是模块那一层,这样通过一致的URL:

http://ip:port/employee/index.html就都能访问到了

3. 可是这样一来,require("employee/static/package")又访问不到了,因为多了一级static

http://ip:port/employee/static/package => employee/static/static/package.js// 错了

所以要写成require("employee/package"),这样才对

4. 问题是上述require,在开发阶段是好使的,但是在生产环境是坏的。因为seajs的规则决定了,合并后的package.js必须放在employee/static/下,所以要从具体的模块中拿出来,单独放到sea_modules里面,整个路径是sea_modules/employee/static/package.js,然后把seajs base设置成sea_modules。再通过transport alias,自动把require("employee/package")改成require("employee/static/package")

5. 最后还要在index.html里处理一下,主要是判断当前的环境,设置不同的seajs base,以及seajs.use()

总结

  • 一个模块一个出口
  • 模块内部依赖用相对标识,跨模块依赖用顶级标识
  • 合并压缩后的seajs模块,目录相对位置要一致
  • 利用一些小技巧区分开发环境和部署环境
  • 绝对路径有时候挺好用的

一种模块化开发的目录结构和部署tips的更多相关文章

  1. Asp.net Mvc模块化开发系列(目录)

    模块化开发是非常重要的,模块化开发是个系统性问题,为此我觉得有必须要写一个系列的文章才能基本说的清楚 那又为什么要写一个目录呢? 其一.是对我昨天承诺写一个系列新的文章的回应 其二.是先写出一个大纲, ...

  2. Tomcat的目录结构及部署应用程序

    下载好的二进制的Tomcat,解压会看到7个目录,如下: bin 目录:Tomcat的脚本存放目录,如启动.关闭脚本等.其中 **.bat用于windows平台,**.sh用于Linux平台 conf ...

  3. Android开发:程序目录结构详解

    HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...

  4. [原创]java WEB学习笔记02:javaWeb开发的目录结构

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. 微信小程序购物商城系统开发系列-目录结构

    上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的 ...

  6. 二十一、【.Net开源框架】EFW框架Web前端开发之目录结构和使用FireBug调试方法

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu. ...

  7. IOS开发的目录结构

    http://www.itjhwd.com/iosmolukaifa/ 目录结构      个人总结:  =============================================== ...

  8. vue项目开发基本目录结构

    § 目录结构 . ├── build/ # Webpack 配置目录 ├── dist/ # build 生成的生产环境下的项目 ├── src/ # 源码目录(开发都在这里进行) │ ├── ass ...

  9. spring boot 项目开发常用目录结构

    在spring boot开发中一些常用的目录划分 转载自https://blog.csdn.net/Auntvt/article/details/80381756: 一.代码层结构 根目录:net.c ...

随机推荐

  1. 在多线程中使用spring的bean

    由于spring在java开发中的广泛运用大大的方便了开发的同时,当运用一些技术比如多线程等 在由spring管理的配置文件中,可以通过封装spring提供工具,手动获得spring管理的bean,这 ...

  2. Luogu1445 [Violet]樱花 ---- 数论优化

    Luogu1445 [Violet]樱花 一句话题意:(本来就是一句话的) 求方程 $\frac{1}{X} + \frac{1}{Y} = \frac{1}{N!}$ 的正整数解的组数,其中$N \ ...

  3. BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...

  4. 关于dubbo服务的xml配置文件报错的问题

    在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...

  5. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest (5/9)

    2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest B. Forcefield 题意 给你一维平面上n个镜子 ...

  6. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem C. Contest 水题

    Problem C. Contest 题目连接: http://codeforces.com/gym/100714 Description The second round of the annual ...

  7. vs 2010 :类型化数据集DataSet应用

    1.启动服务器资源管理器,建立数据库连接 2.在项目中创建数据集 3.为数据集添加表对象 4.为表适配器tableAdapter添加参数化查询 5.修改表适配器的主查询,或添加其他查询 Update: ...

  8. WinForm基于插件开发实现多项配置存储

    一.课程介绍和实例在线演示 明人不说暗话,跟着阿笨一起玩WinForm.本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C ...

  9. Modbus TCP和Modbus Rtu协议的区别 转

    http://blog.csdn.net/educast/article/details/9177679   Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MOD ...

  10. 在Visual Studio中使用类图描述领域模型

    右键解决方案,添加一个名称为"Domain Model"的UML类图. 首先站在整体的角度添加类,先不要任何属性. 添加Customer对Wishlist的关联,把"属性 ...