一种模块化开发的目录结构和部署tips
开发环境
开发态目录结构类似:
然后用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的更多相关文章
- Asp.net Mvc模块化开发系列(目录)
模块化开发是非常重要的,模块化开发是个系统性问题,为此我觉得有必须要写一个系列的文章才能基本说的清楚 那又为什么要写一个目录呢? 其一.是对我昨天承诺写一个系列新的文章的回应 其二.是先写出一个大纲, ...
- Tomcat的目录结构及部署应用程序
下载好的二进制的Tomcat,解压会看到7个目录,如下: bin 目录:Tomcat的脚本存放目录,如启动.关闭脚本等.其中 **.bat用于windows平台,**.sh用于Linux平台 conf ...
- Android开发:程序目录结构详解
HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidM ...
- [原创]java WEB学习笔记02:javaWeb开发的目录结构
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 微信小程序购物商城系统开发系列-目录结构
上一篇我们简单介绍了一下微信小程序的IDE(微信小程序购物商城系统开发系列-工具篇),相信大家都已经蠢蠢欲试建立一个自己的小程序,去完成一个独立的商城网站. 先别着急我们一步步来,先尝试下写一个自己的 ...
- 二十一、【.Net开源框架】EFW框架Web前端开发之目录结构和使用FireBug调试方法
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu. ...
- IOS开发的目录结构
http://www.itjhwd.com/iosmolukaifa/ 目录结构 个人总结: =============================================== ...
- vue项目开发基本目录结构
§ 目录结构 . ├── build/ # Webpack 配置目录 ├── dist/ # build 生成的生产环境下的项目 ├── src/ # 源码目录(开发都在这里进行) │ ├── ass ...
- spring boot 项目开发常用目录结构
在spring boot开发中一些常用的目录划分 转载自https://blog.csdn.net/Auntvt/article/details/80381756: 一.代码层结构 根目录:net.c ...
随机推荐
- springboot工程pom的两种配置方式
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- rabbitmq学习(六) —— 主题
主题交换(Topic exchange) 使用 topic 类型的交换器,不能有任意的绑定键,它必须是由点隔开的一系列的标识符组成.标识符可以是任何东西,但通常它们指定与消息相关联的一些功能.其中,有 ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-3
学完了插值,我们来学习在场景里面添加一个立体彩色球(三维插值) 按照惯例,先看效果: Chapter4: Adding a sphere 我们又一次面临图形学的主要任务. 我们需要再次回顾coord1 ...
- Java 持久化之 -- IO 全面整理(看了绝不后悔)
目录: 一.java io 概述 什么是IO? IO包括输入流和输出流,输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流 输入流指的是从内存读取到外界 ,分为字符输入流和字节 ...
- BZOJ.2705.[SDOI2012]Longge的问题(莫比乌斯反演 欧拉函数)
题目链接 \(Description\) 求\[\sum_{i=1}^n\gcd(i,n)\] \(Solution\) \[ \begin{aligned} \sum_{i=1}^n\gcd(i,n ...
- 【NOIP复习】最短路总结
[模板] /*堆优化Dijkstra*/ void dijkstra() { priority_queue<pair<ll,int>,vector<pair<ll,int ...
- hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)
题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...
- BZOJ2217 : [Poi2011]Lollipop
若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdi ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 182 Solved: 70[Submit][Status][Discuss ...
- 使用POI操作PPT文档(插入文本、图片)转
1)如果是创建新的PPT文档,直接使用SlideShow和Slide类就可以,其中SlideShow表示PPT文档,Slide表示某一张幻灯片如下代码创建空的PPT文档: SlideShow ppt ...