# Kickoff
**Repository Path**: leolord/Kickoff
## Basic Information
- **Project Name**: Kickoff
- **Description**: WebPack based web project scaffold
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2015-09-09
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#基于WebPack的web项目模板
本项目是基于WebPack编译的web项目模板,其中强制要求使用lesscss。而对于JS比较宽松,可以使用原生的JavaScript、ES6格式的JavaScript或者JSX。
## 目前支持的特性
* jsx
* es6
* ejs
* jade
* uglify
* eslint
* less
* autoprefix
* cleancss
* minify-html
## ES6与React
目前已经全面支持es6和react,不过为了尽量缩短编译时间,es6的文件必须命名为`*.es6.js`,React的用到jsx语法的文件必须命名为`*.jsx`。ES 6和JSX的语法支持是由`bebel`提供的,默认设置的是最大可能的支持新的语法特性,也就是说最新的ES 7中得部分语法也可以尝试使用。
## 关于那个恶心的`.eslintrc`文件
`eslint`是目前功能最全面的js语法检查器,它支持茫茫多的检查规则。我们希望最大程度的利用`eslint`保证我们代码的规范性和可读性,所以我们几乎在`.eslintrc`文件中设置了所有检查规则。如果这些规则确实对你造成了困扰,建议通过[inline](http://eslint.org/docs/user-guide/configuring)的方式配置单个文件的语法检查规则。直接修改全局的`.eslintrc`文件其实是降低了对于自己代码的要求。
## 目录结构约定
所有JavaScript和Less文件应当放在app目录中,每个页面对应app目录中的一个文件夹,其中index.js、index.es6.js,或者index.jsx是页面的入口脚本,index.less是页面样式的入口,我们不考虑支持用原生css编写页面样式,因为原生css不利于模块化开发。
```
▾ app/
▾ {{pageName}}/ /*页面assets目录*/
index.js /*页面入口脚本*/
index.less /*页面入口样式*/
▾ template/ /*页面html目录,我们强制建议使用jade模版(合格的程序员,应该避免任何形式的代码重复)*/
{{pageName}}.jade /*使用jade模板的页面文件*/
{{pageName}}.ejs /*使用ejs模板的页面文件*/
▸ img/ /*图片文件夹,这个文件夹的名称不做约束,不过需要在package.json中配置这些需要拷贝到dist根目录下的文件的glob*/
▸ scripts/ /*gulp各个任务的脚本和webpack的配置文件*/
▾ dist/ /*assets编译输出目录,你不应手动修改其中任何文件*/
{{pageName}}.html
▾ {{pageName}}
index.1435971510804.js /*页面的入口脚本,我们通过时间戳方式保证新部署上去的页面能够马上生效*/
index.1435971510804.js.map/*仅在开发环境中才会生成map文件*/
index.1435971510804.css
▾ vendor /*需要异步加载的文件所在的目录*/
1.js
...
commons.chunk.js /*通用脚本文件所在的目录,所有页面中都需要引入*/
commons.chunk.js.map /*仅在开发环境中才会生成map文件*/
```
## 开始
### 初始化项目目录
```
ProjectName=MyProject #项目名称#
git clone https://github.com/leolord/Kickoff.git $ProjectName
cd $ProjectName
npm install
bower install
```
### 修改必要的字段
包括:
1. `package.json` 中项目名称、版本号、git仓库地址、关键字、作者的姓名和联系方式等
2. `bower.json` 中项目名称、关键字、项目介绍、版本号
3. 如果你用bower安装了其他的包,最好在`scripts/webpack/alias.json`中配置下,这样在页面中引用模块就会更方便
### 新建页面
使用以下命令,并根据提示输入页面的名称和类型
```shell
gulp page
```
该命令会
1. 在template目录下新建对应的`EJS`文件
2. 在app目录下新建对应的目录,并创建空白的`js`和`less`文件
### 引入全局脚本/样式
某些情况下,我们希望全站都引用同一份全局的脚本/样式,这样这个脚本/样式可以被浏览器缓存,有利于提高网站性能。此时,应当在`package.json`中的`path/globalLibs`配置这些全局文件的路径,编译的时候,这些全局文件会被拷贝到`dist/vendor`目录中。同时也请在模板文件中,在页面脚本加载之前引入这些全局文件,以确保全局脚本可以在正确的时间注册全局变量。
### 编译
```shell
gulp build
```
或者
```shell
gulp
```
### 开发
```
gulp dev
```
之后访问 就可以看到结果了,生成的编译结果存在于目录中,其实你只关心这个目录就可以了。这个命令实质上调用了`webpack-dev-server`。
### 清理dist目录
**注意** 每次执行gulp/gulp dev/gulp build命令的时候,都会自动执行一次gulp clean命令。
```shell
gulp clean
```
### Note:
1. WebPack很强大,可以引用NodeJS的部分包,不过最好不要用,因为体积真心不小
2. 在`scripts/webpack/alias.json`中配置alias的时候,不要使用大写字母,否则在Linux下可能无法正确的解析依赖包的路径
3. Webpack异步加载脚本是以当前页面所在的路径为根路径的,不同路径的页面引用相同的脚本,通常不会出问题;但是如果脚本异步加载了某些文件,`webpack`计算相对路径可能出错,如果遇到这样的问题,请将`scripts/webpack/webpack-config.generator.js`文件中`configEntry`函数设置的`publicPath`设置为绝对路径
## Q&A
* 为什么不支持sass?
因为less简单,sass必须安装ruby等工具,而在天朝,这一点可能会拦住很多初学者;less只需要NodeJS环境就可以了。虽然我认可sass比less强大,但是我同样认为安装ruby等一堆工具划不来。
* 为什么不放弃bower,转投npm?
根据大牛们的说法,bower有种种缺陷,而如果使用npm的话,能够得到的好处至少有:
1. npm的API比bower稳定;
2. 对于CommonJS语法有天然的支持,不需要再单独配置依赖库的路径,也不需要require相对路径;
3. npm下载的包更小。
4. webpack能够编译出更小的代码,这也是webpack推荐的方式。
对于我们而言,我们依旧不会彻底放弃bower,因为通过bower下载完整的git仓库(接近完整)可以保证两点:
1. 对于Less Mixin这样的类库,可以有很好的支持;
2. npm下载的文件比较少,我们担心如果我们只是依赖一个库中的一个源文件,npm会下载编译完成的完整的包,导致我们最终打包出来的文件太大。
3. 对于多个页面会用到的第三方脚本,我们希望其能够在浏览器端最大限度的缓存,不会因为未来的某次编译造成缓存失效,所以还是会在HTML中直接引入一些通用的第三方的库,比如jQuery、zepto等。
总体上而言,我们希望尽可能的使用npm,而不是bower。
* 为什么不在脚本后面增加类似`?ts=timestamp`这样的参数保证新部署的脚本/样式能够马上生效?
通过在URL后面增加`?t=timestamp`的方式,可能造成一些浏览器无法缓存脚本。
* 为什么选择Jade这样和HTML的语法几乎完全不同的模板引擎作为首选?
原因有三:
1. 期初这个项目优先使用EJS模板,但是之后发现EJS模板中JS和HTML代码耦合太严重,而且HTML本身的语法很臃肿,也很混乱,所以选择了更加干净的Jade引擎。
2. 我习惯使用vim+Syntastic,为了语法高亮,我必须将EJS的文件格式设置为`html`,但是这个时候,Syntastic会爆出一堆没有用的错误信息,让人看上去很烦,同事语法高亮也不尽如人意。
3. Jade的语法要比ejs强大,当然副作用是编译出来的结果文件(JavaScript文件)稍微大一些。
4. Jade会默认转义变量,这样安全性更高。