first commit

This commit is contained in:
编码猿
2024-09-27 00:52:52 +08:00
commit d5a61090de
72 changed files with 11656 additions and 0 deletions

23
.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

1
.pydio Normal file
View File

@@ -0,0 +1 @@
b1c3f8e7-f80c-49f3-9ffe-c9e1296ed01f

7
Template/.gitignore vendored Executable file
View File

@@ -0,0 +1,7 @@
.DS_Store
node_modules/
.git-credentials
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json*

1
Template/.pydio Normal file
View File

@@ -0,0 +1 @@
e90a6ca3-776a-4719-8af9-f7a80ab8b6dd

21
Template/CHANGES.md Executable file
View File

@@ -0,0 +1,21 @@
## 1.1.7
* 增加`sh`文件夹,实现在`Linux`系统上的一键提交代码至`git`
* 增加对`public`css文件和`font`文件的同步`src`删除操作
* 增加对`public`中第三方css文件的编译支持
* 增加对字体文件夹`font`的编译支持
* 更改`less``stylus`,使语法更简洁美观
* 增加更多的代码详细的代码注释,一目了然
## 1.1.6
* `tinify` 速度实在太慢已去除这个模块,等白天我来自己写个。
* 修改优化 gulp 代码,去除冗余!
## 1.1.2
* 这个模块`tinify`超过500次使用就要钱所以正在开发自己的图片压缩插件(尽请期待..)
* 去除gulp-imagemin模块增加 `tinify` 模块的自动图片压缩
## 1.0.2
* 去除gulp.js图片压缩模块因为这个模块问题太多用不了
* 根据朋友建议增加对css编译的修改page/ 文件合并public/ 公共模块不合并
* 根据朋友建议去除对 lessjsjade代码编译后的自动压缩
* 增加更多源码注释

201
Template/LICENSE Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

72
Template/README.md Executable file
View File

@@ -0,0 +1,72 @@
<p align="center"><img src="docs/_media/img/gen.svg"/></p>
<p align="center"><a href="http://nodejs.cn/"><img src="https://img.shields.io/badge/Node.js%20-v8.9.3-green.svg" alt="Node"></a> <a href="https://www.gulpjs.com.cn/"><img src="https://img.shields.io/badge/gulp.js-3.9.1-red.svg" alt="gulpjs"></a> <a href="http://www.expressjs.com.cn/"><img src="https://img.shields.io/badge/express.js-4.16.3-blue.svg" alt="expressjs"></a></p>
## WHtml
> 一款让你用更加丝滑更符合组件化思想的方式来编写传统前端HTML页面
- 1: **脚手架地址:[whtml-cli](https://www.npmjs.com/package/whtml-cli)**
- 2: 文档地址:[Whtml](https://helpcode.github.io/Whtml/#/)
- 2: 创想工作室QQ群[399041912](http://shang.qq.com/wpa/qunwpa?idkey=6311ead3dd326b975b76cb90590535973515776cf83d0854c0dc7b4a5c9cebfb)
## 介绍
当你在编写传统HTML页面的时候是否曾经遇到过静态页面众多导致htmlcssja代码过度冗余将大部分时间花在不断的ctrl+cctrl+v上是否想过能将传统静态页面的公共部分例如头部和底部分离出来不需要每次的复制粘贴是否想过css代码频繁重复为何不能像写JavaScript那样封装成函数直接调用。
是否想过省去每次写css3时需要手动去加浏览器前缀的烦恼等是否不想让自己辛勤编码的成果被别人轻而易举的获取到。是否抱怨过美工给的素材太大等。。。
为何我们不能换种方式来进行更加优雅自动化的编码,我们只关心核心页面的编写,其他一切交给程序帮助我们自动化实现?
## 特性
`WHtml`能够让你获得以下更加爽快的体验:
- 1: 将静态页面组件化模块化,降低重复代码的重复编写。
- 2: 基于Node.js + Gulp 自动化构建项目,让前端的你无缝对接
- 3: 采用jade + stylus用更加简洁高效的方式去书写html和css
- 4: 自动压缩合并编译htmlcssJavaScript使的项目具备更加优秀的响应速度
- 5: 更加自由的框架配置和详细的中文代码注释,一键轻松配置源码实现定制化
- 6: 简洁明了的ES6+语法,代码赏心悦目,提升编码乐趣。
- 7: 程序实时编译同步你的每一行修改,删除,重命名,新建为你自动构建输出到 dist/代码写完程序自动zip压缩打包你需要做的是将zip发给你的后端即可。
- 9: ....等
更多的功能期待你的切身尝试!
## 版本更新
- 1.1.7
* 增加`sh`文件夹,实现在`Linux`系统上的一键提交代码至`git`
* 增加对`public`css文件和`font`文件的同步`src`删除操作
* 增加对`public`中第三方css文件的编译支持
* 增加对字体文件夹`font`的编译支持
* 更改`less``stylus`,使语法更简洁美观
* 增加更多的代码详细的代码注释,一目了然
- 1.1.6
* `tinify` 速度实在太慢已去除这个模块,等白天我来自己写个。
* 修改优化 gulp 代码,去除冗余!
- 1.1.2
* 这个模块`tinify`超过500次使用就要钱所以正在开发自己的图片压缩插件(尽请期待..)
* 去除gulp-imagemin模块增加 `tinify` 模块的自动图片压缩
- 1.0.2
* 去除gulp.js图片压缩模块因为这个模块问题太多用不了
* 根据朋友建议增加对css编译的修改page/ 文件合并public/ 公共模块不合并
* 根据朋友建议去除对 lessjsjade代码编译后的自动压缩
* 增加更多源码注释
## 捐赠
如果你觉得 `WHtml` 对你有帮助,或者想对我微小的工作一点资瓷,欢迎给我提建议。

11
Template/app.js Executable file
View File

@@ -0,0 +1,11 @@
// express 框架部分
const express = require('express')
const app = express()
// 站点配置
const config = require('./config')
// 工具函数
const { OpenBrowser } = require('./utils')
// 核心,需要被 express 托管的静态资源文件路径
app.use(express.static('./dist'))
// 监听 1314 端口,运行网站
app.listen(config.nodeService.port, () => OpenBrowser() );

1
Template/config/.pydio Normal file
View File

@@ -0,0 +1 @@
aea4f241-7eed-4c98-bf2f-69f0b3d246e7

38
Template/config/index.js Executable file
View File

@@ -0,0 +1,38 @@
/**
* 网站配置信息
*/
module.exports = {
jade: {
// jade -> html 需要监听转换的jade文件路径
jadeTohtml: "./src/view/main/*.jade",
// html 输出的路径
jadeTodist: "./dist/"
},
styl: {
// 将 public/ 公共的 styl 文件直接编译在 dist/ 中生成对应的
stylTocssPublic: "./src/assets/css/public/*.styl",
cssToDist: "",
// 将 page/ 中 styl 编译合并
stylTocssPage: "./src/assets/css/layout.styl",
// styl 转换完成后,需要将多个文件合并成一个的文件名
stylToFileName: "main.css",
// css 输出的路径
stylTodist: "./dist/css/"
},
watch: {
// gulp 需要监听的文件路径当我们在src修改源码时gulp会动态编译输出到dist
watchFile: "src/**/*"
},
nodeService: {
// 访问ip
host: "http://127.0.0.1:",
// 访问端口
port: 1314,
default: "about.html",
// 提示信息
log: "app is run here: ",
// 是否开始自动打开浏览器功能取值truefalse
isOpenBrowser: false
}
};

0
Template/docs/.nojekyll Executable file
View File

1
Template/docs/.pydio Normal file
View File

@@ -0,0 +1 @@
6a94895c-3a6d-4067-b249-c52d03b04bce

49
Template/docs/README.md Executable file
View File

@@ -0,0 +1,49 @@
# WHtml
> 一款让你用更加丝滑的方式来编写传统前端HTML页面
- 1: 文档地址:[Whtml](https://helpcode.github.io/Whtml/#/)
- 2: 创想工作室QQ群[399041912](http://shang.qq.com/wpa/qunwpa?idkey=6311ead3dd326b975b76cb90590535973515776cf83d0854c0dc7b4a5c9cebfb)
# 介绍
---
当你在编写传统HTML页面的时候是否曾经遇到过静态页面众多导致htmlcssja代码过度冗余将大部分时间花在不断的ctrl+cctrl+v上是否想过能将传统静态页面的公共部分例如头部和底部分离出来不需要每次的复制粘贴是否想过css代码频繁重复为何不能像写JavaScript那样封装成函数直接调用。
是否想过省去每次写css3时需要手动去加浏览器前缀的烦恼等是否不想让自己辛勤编码的成果被别人轻而易举的获取到。是否抱怨过美工给的素材太大等。。。
为何我们不能换种方式来进行更加优雅自动化的编码,我们只关心核心页面的编写,其他一切交给程序帮助我们自动化实现?
## 特性
`WHtml`能够让你获得以下更加爽快的体验:
---
- 1: 将静态页面组件化模块化,降低重复代码的重复编写。
- 2: 基于Node.js + Gulp 自动化构建项目,让前端的你无缝对接
- 3: 采用jade + stylus用更加简洁高效的方式去书写html和css
- 4: 自动压缩合并编译htmlcssJavaScript使的项目具备更加优秀的响应速度
- 5: 更加自由的框架配置和详细的中文代码注释,一键轻松配置源码实现定制化
- 6: 简洁明了的ES6+语法,代码赏心悦目,提升编码乐趣。
- 7: 程序实时编译同步你的每一行修改,删除,重命名,新建为你自动构建输出到 dist/代码写完程序自动zip压缩打包你需要做的是将zip发给你的后端即可。
- 9: ....等
更多的功能期待你的切身尝试!
## 捐赠
---
如果你觉得 `WHtml` 对你有帮助,或者想对我微小的工作一点资瓷,欢迎给我提建议。

12
Template/docs/_coverpage.md Executable file
View File

@@ -0,0 +1,12 @@
![logo](_media/img/gen.svg)
# WHtml <small>v1.1.0</small>
> 一款自动化模块化的HTML页面编写框架
* 轻量小巧,编译丝滑
* 免费开源
* 适用强,高度订制
[GitHub](https://github.com/QingWei-Li/docsify/)
[开始](#WHtml)

View File

@@ -0,0 +1 @@
e1a88b3c-ca75-40a9-aebd-d20d2e27f4ee

View File

@@ -0,0 +1 @@
61a5299c-304d-450b-88b2-bfc0b2d2b584

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

343
Template/docs/_media/img/gen.svg Executable file
View File

@@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="259px" height="211px" viewBox="0 0 259 211" enable-background="new 0 0 259 211" xml:space="preserve"> <image id="image0" width="259" height="211" x="0" y="0"
xlink:href="data:image/png;base64,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
4A+sAAAAAElFTkSuQmCC" />
</svg>

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

14
Template/docs/_sidebar.md Executable file
View File

@@ -0,0 +1,14 @@
* 基础
* [开始](install.md)
* [安装](becareful.md)
* 架构设计
* [使用](use.md)
* [源码](code.md)
* 关于
* [关于<sup style="color:red">(赞)<sup>](team.md)

73
Template/docs/becareful.md Executable file
View File

@@ -0,0 +1,73 @@
## 环境准备
---
### windows
首先安装最基本的Node.js环境先去官网下载最新版的nodejs记住根据你的操作系统和位数选择下载。
> 官网地址: [http://nodejs.cn/download/](http://nodejs.cn/download/)
虽然在Windows上安装很简单但是为了避免错误具体的安装过程参考这篇教程
[Node.js 安装配置 http://nodejs.cn/download/](http://nodejs.cn/download/)
!> 注意安装nodejs的路径杜绝使用中文记住杜绝包含中文的路径
### Linux
Linux下安装比Windows稍微麻烦一点点这边安装方式很多。不推荐用`apt-get install xxx` 来安装,因为版本老旧。也不推荐下载文件然后改配置,个人感觉不好(你也可以选择这种方法)。
我这边推荐使用的方法是:**编译源码安装**
具体操作看这篇教程,不再累述:
> [Linux安装Node.js源码编译安装](https://www.yiibai.com/html/node_js/2013/0826201.html)
## 部署代码
---
上面的步骤很简单没有什么可说的,假设你已经完美安装成功,那么我们开始愉快的部署代码吧。
**1: 解决依赖**
---
命令提示符界面输入命令
> npm install
如果npm下载速度十分缓慢请更换npm为cnpm具体操作百度太简单懒得详细说
成功更换为cnpm后名称变为下面
> cnpm install
OK到这一步基本上我们的框架就可以被成功的运行起来来。
## 运行代码
---
查看`package.json`文件中`scripts`字段,你可以通过命令:
> npm run all
来运行框架。
## 运行帮助文档
---
**如果你想查看网站的帮助文档,那么很简单,运行下面的命令即可:**
> npm run doc
## 自动提交
---
> npm run push

175
Template/docs/code.md Executable file
View File

@@ -0,0 +1,175 @@
## 源码分析 - package.json
---
上面说过了,我们可以通过`npm run all`命令来运行框架。那么我们这边先从`package.json`开始分析,看看这行命令背后到底发生了哪些事情。
打开`package.json`你将看到下面这些代码:
```bash
"scripts": {
"all": "node_modules/.bin/concurrently \" node_modules/.bin/node-dev app.js \" \"node_modules/.bin/gulp \" ",
"doc": "node_modules/.bin/docsify serve ./docs"
}
```
1all 通过nodejs的 `concurrently` 模块来并发执行两条命令,其中`node-dev app.js`是用来启动`express`框架运行我们编译后产生的静态文件`dist/`。而`gulp`命令执行的是`gulpfile.js`中的默认任务`default`
2doc :通过 `docsify` 来运行我们网站的帮助文档,这里没有什么好说的。
---
我们框架的关键逻辑在`all`命令背后,通过上面知道`all`命令运行后会并发执行`node-dev app.js`,我们打开项目根目录下的`app.js`探究一下:
```js
// express 框架部分
const express = require('express')
const app = express()
// 站点配置
const config = require('./config')
// 工具函数OpenBrowser 自动打开浏览器
const { OpenBrowser } = require('./utils')
// 核心,需要被 express 托管的静态资源文件路径,提供给前端访问静态页面
app.use(express.static('./dist'))
// 监听 1314 端口,运行网站
app.listen(config.nodeService.port, () => OpenBrowser() );
```
这部分源码注释很详细也很简单,没什么可说的吧,一看就懂。
我们的核心应该在`gulp`命令背后,打开`gulpfile.js`文件,你将看到以下源码:
```js
const gulp = require('gulp')
// 编译jade文件为hrml
const jade = require('gulp-jade')
// 编译stylus文件为css
const stylus = require('gulp-stylus')
// 自动为css3属性加前缀
const autoprefixer = require('gulp-autoprefixer')
// 合并jscss文件
const concat = require('gulp-concat')
// 压缩css
const cssmin = require('gulp-clean-css')
// gulp 文件监听
const watchPath = require('gulp-watch-path')
// zip压缩
const zip = require('gulp-zip')
// 压缩js文件
const uglify = require('gulp-uglify')
// 处理gulp错误防止程序报错终止
const plumber = require('gulp-plumber')
// 引入gulp的配置文件
const config = require('./config/index.js')
// 引入全局公共方法
const { RemoveFile } = require('./utils')
/**
* 编译jade为html
*/
gulp.task('jade', function() {
return gulp.src(config.jade.jadeTohtml)
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(jade({
pretty: true
}))
.pipe(gulp.dest(config.jade.jadeTodist))
})
...
/**
* 监听用户在 src/ 的所有文件操作
*/
gulp.task('file', function() {
gulp.watch(config.watch.watchFile, function(event) {
let paths = watchPath(event,'src/', 'Template/src/')
switch (event.type){
case 'deleted':
console.log('删除操作...')
RemoveFile(paths.srcFilename)
break
default:
console.log('其他操作...')
gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','Online')
break
}
})
})
/**
* 默认先运行一次 编译过程
*/
gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','Online')
/**
* 执行file任务当文件被操作后进行相关的编译过程
*/
gulp.task('default',['file'])
```
这边通过`gulp.watch`实现对`src/`文件夹进行监听,当用户修改被监听的`src/`文件夹里的文件后使用`gulp-watch-path`模块获得被修改文件的路径,然后判断`event.type`的操作类型,根据操作类型来进行对应的操作。
1如果是在`src/`文件夹中的删除操作,那么调用`utils/index.js`里的方法`RemoveFile()`同步去删除对应被编译后的文件。
2如果是其他操作例如修改添加等直接将进行重新编译输出到`dist/`中,保持在`src`中的修改被同步到`dist/`中。这一步就是我们最核心的页面逻辑了。其实也没什么,你会发现还是很简单的。
## 源码分析 - src/
---
`src`文件夹中是前端工程师真正需要关心的源码部分。
- 1 `assets`是静态资源的存放。
- 2 `view`是页面的存放。
- 3 `main/`文件夹中存放主要的页面,
- 4 `public/`存放公共的页面组件,而`layout.jade`是页面的核心入口
## 源码分析 - 配置/
---
你可以在网站的`config/index.js`文件来修改基本配置做到设置端口打开url地址是否自动打开浏览器等具体配置信息如下
```js
module.exports = {
"jade":{
// jade -> html 需要监听转换的jade文件路径
"jadeTohtml": "./src/view/main/*.jade",
// html 输出的路径
"jadeTodist": "./dist/"
},
"styl":{
// 将 public/ 公共的 styl 文件直接编译在 dist/ 中生成对应的
"stylTocssPublic": "./src/assets/css/public/*.styl",
// 将 page/ 中 styl 编译合并
"stylTocssPage": "./src/assets/css/layout.styl",
// styl 转换完成后,需要将多个文件合并成一个的文件名
"stylToFileName":"main.css",
// css 输出的路径
"stylTodist":"./dist/css/"
},
"watch":{
// gulp 需要监听的文件路径当我们在src修改源码时gulp会动态编译输出到dist
"watchFile":"src/**/*"
},
"nodeService": {
// 访问ip
"host":"http://127.0.0.1:",
// 访问端口
"port": 1314,
// 提示信息
"log":"项目运行在:",
// 是否开始自动打开浏览器功能取值truefalse
"isOpenBrowser": false
}
}
```

26
Template/docs/index.html Executable file
View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WHtml</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="description" content="Description">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//unpkg.com/docsify/lib/themes/vue.css">
<link rel="shortcut icon" href="_media/img/favicon.ico" />
<link rel="bookmark" href="_media/img/favicon.ico" type="image/x-icon" />
</head>
<body>
<div id="app">Loading</div>
<script>
window.$docsify = {
coverpage: true,
name: 'WHtml',
repo: '',
loadSidebar: true,
subMaxLevel: 2,
}
</script>
<script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
</body>
</html>

26
Template/docs/install.md Executable file
View File

@@ -0,0 +1,26 @@
## 说明
---
拿到框源码后并不是直接双击HTML通过浏览器来运行这边需要你根据我的文档说明做好基本的环境配置然后来运行我们的框架。
请按照我制定的规范来编写前端HTML代码其他只需要交由框架来帮你搞定一切或许你不适应这种代码的编写方式甚至没听过所谓的html模板引擎css预处理器gulp自动化工具。
但你需要习惯这种开发方式,大的团队普遍适用的技术套路你真的有必要去学习,不要抱怨,逼着自己埋头苦练技术提升自己的能力才是最根本。
## 技术架构
---
- 1: 基于Node.js开发
- 2: gulp作为自动化构建工具
- 3: HTML模板引擎采用jade
- 4: stylus作为项目css的预编译器
- 5: 使用express的来托管gulp编译后的dist/静态文件夹启动nodejs服务器来访问静态网站查看效果。
- 6: concurrently 实现命令的多条并发执行
- 7: cli-color 实现终端命令行输出彩色信息
- 8: 采用 node-dev 当我们修改js文件后自动重启node进程
- 9: open模块实现自动为你打开浏览器并运行我们的网站
- 10 autoprefixer帮你自动解决css3特性的浏览器前缀问题
- 11 minify-cssconcat为你自动压缩美化合并多个css文件
- 12 imagemin 实现图片的自动高清压缩

23
Template/docs/team.md Executable file
View File

@@ -0,0 +1,23 @@
## 团队
---
我们的团队名叫`创想工作室`由一群热衷技术的小伙伴组成欢迎加入创想工作室QQ群这里有同样热衷技术也有很多正在学习过程中的小伙伴。
> <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=6311ead3dd326b975b76cb90590535973515776cf83d0854c0dc7b4a5c9cebfb"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="创想工作室(技术)" title="创想工作室(技术)"></a>
## 源码下载
---
项目源码已经上传到github感兴趣的同学可以去github下载代码这里贴上地址
> [https://github.com/helpcode/Whtml](https://github.com/helpcode/Whtml)
## 鸣谢感恩
---
十分感谢众多优秀开源的技术支持,众多开源技术的帮助才能让我们的项目编码更加方便。

53
Template/docs/use.md Executable file
View File

@@ -0,0 +1,53 @@
## 目录解读
---
首先我们来看以下框架的文件层级结构,从宏观上了解以下框架的基本架构,然后我们在一一解读其具体的源码实现,目录结构图如下:
```html
.
├── app.js #通过nodejs的web框架express来启动打包后的dist/静态网站
├── config #基本信息配置,一般修改这里即可实现订制
│   └── index.js
├── dist # gulp编译src产生的文件我们写完静态页面需要交给后端的就是它
├── docs # 框架的帮助文档
├── gulpfile.js # 最核心的 gulp 配置文件,看不懂源码情况下不要修改
├── Online.zip # gulp 自动zip打包 dist/ 文件夹产生的,直接将这个压缩包发给后端,省事
├── package.json # 项目的基本核心配置,你懂的!看不懂源码情况下不要修改
├── .gitignore #git 上传忽略文件配置
├── CHANGES.md #版本更新日志
├── README.md #帮助文档
├── src # 核心源码,主要代码编写在这进行,在这的任何操作都会被同步映射更新到dist/
│   ├── assets # 存放静态资源
│   │   ├── css # css样式
│   │   │   ├── layout.styl #css样式主入口gulp将会从这里进行对css的编译打包
│   │   │   ├── page #对应具体页面的css
│   │   │   │   ├── header.styl #公共头部样式
│   │   │   │   └── index.styl #首页的样式
│   │   │   └── public #全局公共的样式
│   │   │   ├── colors.styl #全局css颜色的封装
│   │   │   ├── lib.styl #全局css方法的封装
| | | ├── reset.styl #清除浏览器默认样式
│   │   ├── img #网站用到的图片
│   │   │   └── gen.svg #测试用的图片[测试可删除]
│   │   └── js #存放js脚本
│   │   ├── demo.js #index.jade 页面组件的私有js文件[测试可删除]
│   │   └── jquery.js #默认自带的 jquery
│   │   └── font #存放网站字体
│   │   ├── awesome.woff2 #测试用的字体[测试可删除]
│   └── view #存放页面的视图jade
│   ├── layout.jade #页面试图的核心入口文件
│   ├── main #存放主要的页面
│   │   └── index.jade #首页
│   └── public #公共页面组件
│   ├── footer.jade #公共版权
│   └── header.jade #公共头部
└── utils #框架需要用的工具类
│  └── index.js
└── sh #shell脚本
  └── push.sh #自动提交代码到github
```
仔细阅读上面对各个文件的作用的解释,这里很关键。

202
Template/gulpfile.js Executable file
View File

@@ -0,0 +1,202 @@
const gulp = require('gulp')
// 编译jade文件为hrml
const jade = require('gulp-jade')
// 编译stylus文件为css
const stylus = require('gulp-stylus')
// 自动为css3属性加前缀
const autoprefixer = require('gulp-autoprefixer')
// 合并jscss文件
const concat = require('gulp-concat')
// 压缩css
const cssmin = require('gulp-clean-css')
// gulp 文件监听
const watchPath = require('gulp-watch-path')
// zip压缩
const zip = require('gulp-zip')
// 压缩js文件
const uglify = require('gulp-uglify')
// 处理gulp错误防止程序报错终止
const plumber = require('gulp-plumber')
// 引入gulp的配置文件
const config = require('./config/index.js')
// 引入全局公共方法
const { RemoveFile } = require('./utils')
const DistPublic = `${config.styl.stylTodist}public`
/**
* 编译jade为html
*/
gulp.task('jade', function() {
return gulp.src(config.jade.jadeTohtml)
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(jade({
pretty: true
}))
.pipe(gulp.dest(config.jade.jadeTodist))
})
/**
* 编译公共页 css
*/
gulp.task('publicstyl', function() {
return gulp.src(config.styl.stylTocssPublic)
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(stylus())
.pipe(autoprefixer({
browsers: ['last 2 versions','last 2 Explorer versions','Android >= 4.0'],
cascade: true
}))
/**
* 压缩兼容处理css文件取消注释使用
*/
// .pipe(cssmin({
// advanced: false,
// compatibility: 'ie7',
// keepBreaks: false,
// keepSpecialComments: '*'
// }))
.pipe(gulp.dest(DistPublic))
})
/**
* 编译主要页面的 css合并为main.css
*/
gulp.task('pagestyl', function() {
return gulp.src(config.styl.stylTocssPage)
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(stylus())
.pipe(autoprefixer({
browsers: ['last 2 versions','last 2 Explorer versions','Android >= 4.0'],
cascade: true
}))
.pipe(concat(config.styl.stylToFileName))
/**
* 同上
*/
// .pipe(cssmin({
// advanced: false,
// compatibility: 'ie7',
// keepBreaks: false,
// keepSpecialComments: '*'
// }))
.pipe(gulp.dest(`${config.styl.stylTodist}page`))
})
/**
* 拷贝 public中的第三方css到dist文件夹
*/
gulp.task('copycss',function(){
return gulp.src('src/assets/css/public/*.css')
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(cssmin({
advanced: false,
compatibility: 'ie7',
keepBreaks: false,
keepSpecialComments: '*'
}))
.pipe(gulp.dest(DistPublic))
})
/**
* 拷贝img 到dist文件夹
*/
gulp.task('copyimg',function(){
return gulp.src('src/assets/img/*')
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(gulp.dest('dist/img'))
})
/**
* 拷贝字体文件
*/
gulp.task('copyfont',function(){
return gulp.src('src/assets/font/*')
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(gulp.dest('dist/font'))
})
/**
* 拷贝js文件
*/
gulp.task('copyjs',function(){
return gulp.src('src/assets/js/*')
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
/**
* 压缩js代码取消注释启用
*/
// .pipe(uglify({
// compress: false
// }))
.pipe(gulp.dest('dist/js'))
})
/**
* 自动zip打包 dist 文件夹,用于提交给后端
*/
gulp.task('Online',function(){
return gulp.src(['./dist/**'])
.pipe(plumber({ errHandler: e => {
gutil.beep()
gutil.log(e)
}}))
.pipe(zip('Online.zip'))
.pipe(gulp.dest('./'))
})
/**
* 监听用户在 src/ 的所有文件操作
*/
gulp.task('file', function() {
gulp.watch(config.watch.watchFile, function(event) {
let paths = watchPath(event,'src/', 'Template/src/')
switch (event.type){
case 'deleted':
console.log('删除操作...')
RemoveFile(paths.srcFilename)
break
default:
console.log('其他操作...')
gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','copycss','Online')
break
}
})
})
/**
* 默认先运行一次 编译过程
*/
gulp.run('publicstyl','copyfont','pagestyl','jade','copyjs','copyimg','copycss','Online')
/**
* 执行file任务当文件被操作后进行相关的编译过程
*/
gulp.task('default',['file'])

33
Template/package.json Executable file
View File

@@ -0,0 +1,33 @@
{
"name": "whtml",
"version": "1.2.8",
"description": "An HTML automatic compiler framework",
"main": "app.js",
"scripts": {
"all": "node_modules/.bin/concurrently \" node_modules/.bin/node-dev app.js \" \"node_modules/.bin/gulp \" ",
"doc": "node_modules/.bin/docsify serve ./docs",
"push": "./sh/push.sh"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"cli-color": "^1.2.0",
"concurrently": "^3.5.1",
"docsify-cli": "^4.2.1",
"express": "^4.16.3",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^5.0.0",
"gulp-clean-css": "^3.9.3",
"gulp-concat": "^2.6.1",
"gulp-jade": "^1.1.0",
"gulp-minify-css": "^1.2.4",
"gulp-plumber": "^1.2.0",
"gulp-stylus": "^2.7.0",
"gulp-uglify": "^3.0.0",
"gulp-watch-path": "^0.1.0",
"gulp-zip": "^4.1.0",
"node-dev": "^3.1.3",
"open": "0.0.5"
}
}

1
Template/sh/.pydio Normal file
View File

@@ -0,0 +1 @@
bbb32e53-9bbc-4537-b22b-2be773a4553a

5
Template/sh/push.sh Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/bash
# 自动提交代码到 githublinux 系统才能使用
message="shell的自动提交更新记录查看CHANGES.md"
git add -A && git commit -m $message && git push

1
Template/src/.pydio Normal file
View File

@@ -0,0 +1 @@
e078f410-1610-4b9e-bbf4-963b92aaf5a3

View File

@@ -0,0 +1 @@
26506e85-84b3-4039-b85c-f999565a06e5

5
Template/src/assets/README.md Executable file
View File

@@ -0,0 +1,5 @@
# 帮助信息,该文件可删除
---
## 存放网站主体静态资源例如cssjsimgfont

View File

@@ -0,0 +1 @@
2ae432b7-8ee8-4fbd-981f-5687c5687aec

View File

@@ -0,0 +1,2 @@
// page less
@import "page/index";

View File

@@ -0,0 +1 @@
57a1e13f-f682-4b48-a7a3-8c9b72ef5e35

View File

@@ -0,0 +1,7 @@
.index
h1
color red
p
font-size 20px

View File

@@ -0,0 +1 @@
c3464317-13fd-44ca-aa3a-1d13e0faca43

View File

@@ -0,0 +1 @@
//

View File

@@ -0,0 +1 @@
// css

View File

@@ -0,0 +1 @@
//

View File

@@ -0,0 +1 @@
0fa95758-9641-46d3-8ca0-34924b9afe7e

Binary file not shown.

View File

@@ -0,0 +1 @@
f84b5704-b115-4780-a90d-ffd0826ba29d

343
Template/src/assets/img/gen.svg Executable file
View File

@@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="259px" height="211px" viewBox="0 0 259 211" enable-background="new 0 0 259 211" xml:space="preserve"> <image id="image0" width="259" height="211" x="0" y="0"
xlink:href="data:image/png;base64,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
4A+sAAAAAElFTkSuQmCC" />
</svg>

View File

@@ -0,0 +1 @@
604b8161-e8a1-404b-bcda-22fd81c1c345

3
Template/src/assets/js/demo.js Executable file
View File

@@ -0,0 +1,3 @@
function demo(){
alert('index.jade 组件独有的js')
}

8829
Template/src/assets/js/jquery.js vendored Executable file

File diff suppressed because it is too large Load Diff

1
Template/src/view/.pydio Normal file
View File

@@ -0,0 +1 @@
1263e9c9-5d9f-4cbe-99b9-2cb359cb43dd

26
Template/src/view/layout.jade Executable file
View File

@@ -0,0 +1,26 @@
//- 网站的核心的公共父级组件
//- 一些全局公共css和js可以在这里被加载
doctype html
html
head
meta(charset="utf-8")
meta(http-equiv="X-UA-Compatible" content="IE=edge")
meta(name="viewport" content="width=device-width, initial-scale=1")
meta(name="renderer" content="webkit")
meta(http-equiv="Cache-Control" content="no-siteapp")
link(rel='stylesheet', href='css/page/main.css')
script(src="js/jquery.js")
block title
body
//- 公共网站头部
include ./public/header
//- 网站主体内容,从 main/*.jade 被载入
block content
//- 公共网站版权
include ./public/footer

View File

@@ -0,0 +1 @@
7a449871-eada-4915-9eb2-b525abb5539a

View File

@@ -0,0 +1,5 @@
# 帮助信息,该文件可删除
---
## 存放网站主体页面组件,例如首页,关于我,联系我们等主要页面内容

View File

@@ -0,0 +1,17 @@
extends ./../layout
//- 网站的头部信息这边拆分出来便于每个页面的SEO配置和配置页面独有的cssjs
block title
title 首页
//- 组件独有的js文件测试案例
script(src="js/demo.js")
//- 网站的主体内容区域
block content
.index
h1 默认首页de
p(onclick="demo()") 通过gulp编译后的html页面点我触发事件

View File

@@ -0,0 +1 @@
28f8706c-c280-4197-92ec-243f6f7a0f92

View File

@@ -0,0 +1,5 @@
# 帮助信息,该文件可删除
---
## 存放网站公共组件例如swiper轮播公共导航等

View File

@@ -0,0 +1,3 @@
.footer
h3 公共版权

View File

@@ -0,0 +1,2 @@
.header
h3 公共头部

1
Template/utils/.pydio Normal file
View File

@@ -0,0 +1 @@
89da04c5-c300-4477-ab98-827d25b9deb7

119
Template/utils/index.js Executable file
View File

@@ -0,0 +1,119 @@
/**
* 全局公共函数
*/
// 自动打开浏览器
const open = require("open");
// 配置信息
const config = require("./../config");
// 终端输出颜色
const clc = require("cli-color");
// 文件操作
const fs = require("fs");
// 路径操作
const path = require("path");
// 获取文件基准地址
const Base = path.resolve(__dirname, "../dist");
/**
* 返回完整的网址
*/
const URL = () =>
`${config.nodeService.host}${config.nodeService.port}/${
config.nodeService.default
}`;
/**
* open 模块: 自动打开浏览器
* 模块地址https://github.com/pwnall/node-open
*/
const OpenBrowser = () => {
Notice(`${config.nodeService.log}${URL()}`);
config.nodeService.isOpenBrowser ? open(URL()) : "";
};
/**
* cli-color 模块:设置终端运行信息的颜色
* @param {*string} log 需要log的信息
* 模块地址: https://github.com/medikoo/cli-color
*/
const Notice = log => {
// 终端输入运行的颜色
let notice = clc.greenBright.bold;
console.log(notice(log));
};
/**
* 当前端从src源码中删除某文件(jadejsimg,css)的时候那么删除对应dist/中编译后文件
* 这里我的思路有点乱,代码等待改进
* @param {*string} filename
*/
const RemoveFile = filename => {
if (SearchKey(filename, "jade")) {
deleteFile(ReturnFullUrl(ReturnFileName(filename, "jade"), "html"));
} else if (SearchKey(filename, "js")) {
deleteFile(ReturnFullUrl(ReturnFileName(filename, "js"), "js"));
} else if (SearchKey(filename, "styl") || SearchKey(filename, "mp3")) {
Notice("忽略该文件...");
} else if (SearchKey(filename, "css")) {
deleteFile(ReturnFullUrl(ReturnFileName(filename, ".css"), "css"));
} else if (SearchKey(filename, "woff2")) {
deleteFile(ReturnFullUrl(ReturnFileName(filename, ".woff2"), "woff2"));
} else if (SearchKey(filename, "ttf")) {
deleteFile(ReturnFullUrl(ReturnFileName(filename, ".ttf"), "ttf"));
} else {
deleteFile(`${Base}/img/${filename}`);
}
};
/**
* 返回对应文件类型的 文件地址
* @param {*string} name 需要删除的文件名称
* @param {*string} type 需要删除的文件类型
*/
const ReturnFullUrl = (name, type) => {
switch (type) {
case "html":
return `${Base}/${name}${type}`;
break;
case "js":
return `${Base}/js/${name}${type}`;
break;
case "css":
return `${Base}/css/public/${name}.${type}`;
break;
case "woff2":
return `${Base}/font/${name}.${type}`;
break;
case "ttf":
return `${Base}/font/${name}.${type}`;
break;
default:
break;
}
};
/**
* 返回的文件名称,例如 index.jade返回 index
* @param {*string} file 文件完整名称
* @param {*string} plug 需要检测的文件后缀
*/
const ReturnFileName = (file, plug) => file.replace(plug, "");
/**
* 删除文件
* @param {*string} path 文件路径
*/
const deleteFile = path =>
fs.unlink(
path,
err => (err ? console.error(err) : Notice(`${path} 对应文件已删除...`))
);
/**
* 检索字符串中是否有匹配的字符
* @param {*string} key 需要检索的字符串
*/
const SearchKey = (par, key) => (par.indexOf(key) != -1 ? true : false);
module.exports = { OpenBrowser, RemoveFile };

1
whtml-cli/.git-credentials Executable file
View File

@@ -0,0 +1 @@
https://{www.2271608011@qq.com}:{!@#$%&*()cvb<??>}@github.com

1
whtml-cli/.pydio Normal file
View File

@@ -0,0 +1 @@
d23c6218-3bc9-48e7-bb9e-93f1b8ca1420

77
whtml-cli/README.md Executable file
View File

@@ -0,0 +1,77 @@
## WHtml-cli
框架[WHtml](https://github.com/helpcode/Whtml)的官方cli脚手架工具让你更加快速的创建项目感受编码的乐趣。
## 安装
一行命令解决一切
> npm install -g whtml-cli
## 使用
你只需要简单的输入以下几条命令即可愉快运行网站:
```js
$ whtml init project # 创建项目 project 为你项目名字(自定义)
$ cd project # 进入文件
$ npm install # 解决依赖
# 提供的命令
$ npm run all # 运行网站
$ npm run doc # 运行帮助手册
$ npm run push # 快速发布至Github仅限Linux
```
## 开源
框架的源代码已经提交`Github`,你可以从`Github`了解更多的信息:
- 1: [Whtml 源码](https://github.com/helpcode/Whtml)
- 2: [Whtml 文档](https://helpcode.github.io/Whtml/#/)
## 特性
`WHtml`能够让你获得以下更加爽快的体验:
---
- 1: 将静态页面组件化模块化,降低重复代码的重复编写。
- 2: 基于Node.js + Gulp 自动化构建项目,让前端的你无缝对接
- 3: 采用jade + stylus用更加简洁高效的方式去书写html和css
- 4: 自动压缩合并编译htmlcssJavaScript使的项目具备更加优秀的响应速度
- 5: 更加自由的框架配置和详细的中文代码注释,一键轻松配置源码实现定制化
- 6: 简洁明了的ES6+语法,代码赏心悦目,提升编码乐趣。
- 7: 程序实时编译同步你的每一行修改,删除,重命名,新建为你自动构建输出到 dist/代码写完程序自动zip压缩打包你需要做的是将zip发给你的后端即可。
- 9: ....等
更多的功能期待你的切身尝试!
## 注意
- 1请先安装`git`并确保`git`命令能在终端中正确反馈,因为`cli`脚手架需要通过`git`来安装下载代码到你的项目中。
- 2`init`下载速度是基于你的网速决定的,如果太慢不需要着急等待片刻就好。
## 贡献
感谢`陈尧瑞`童鞋在实际项目中的使用,并进一步提的宝贵建议。如果你正在使用本框架,并且框架为你带来了更高的效率,请帮忙转发,感谢!框架的编译速度,核心代码逻辑,功能开发等..还有很多优化的地方,你的认可是我开源动力。
如果你有web框架开发经验十分欢迎交流宝贵的设计思想同时项目将稳定持续的更新升级...
## 捐赠
如果你觉得 `WHtml` 对你有帮助或者想对我微小的工作一点资瓷欢迎给我提建议QQ群399041912。

1
whtml-cli/bin/.pydio Normal file
View File

@@ -0,0 +1 @@
31a084b9-4616-4629-9b7e-1b1a17db3970

8
whtml-cli/bin/whtml Executable file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env node
require('commander')
.version(require('../package').version)
.usage('<command> [options]')
.command('init', 'generate a new project from a template')
.command('list', 'list available official templates')
.parse(process.argv)

50
whtml-cli/bin/whtml-init Executable file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env node
const program = require('commander')
const exec = require('child_process').exec
const chalk = require('chalk')
const ora = require('ora')
const { GetUserInfo } = require('./../lib')
const config = require('../package')
program.on('--help', () => {
console.log()
console.log(' Examples:')
console.log()
console.log(chalk.gray(' # create a new project with an official template'))
console.log(' $ whtml init my-project')
console.log()
})
function help () {
program.parse(process.argv)
if (program.args.length < 1) return program.help()
}
help()
let projectName = program.args[0], gitUrl, branch, cmdStr
gitUrl = config.git.url, branch = config.git.branch
cmdStr = `git clone ${gitUrl} ${projectName} && cd ${projectName} && git checkout ${branch}`
run(cmdStr)
GetUserInfo()
const spinner = ora('downloading template...')
spinner.start()
function run(url){
exec(url, (error, stdout, stderr) => {
if (error) {
console.log(error)
process.exit()
}
spinner.stop()
console.log(chalk.green('\n √ Download Success...'))
console.log(chalk.green(`\n cd ${projectName} #Enter the folder\n npm install #Resolve dependence\n npm run all #Running project`))
console.log()
process.exit()
})
}

13
whtml-cli/bin/whtml-list Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/env node
const config = require('../package')
const chalk = require('chalk')
console.log()
console.log(
chalk.green(
`作者:${config.git.auto}\n项目地址:${config.git.url} \n分支${config.git.branch}`
)
)
console.log()
process.exit()

1
whtml-cli/index.js Executable file
View File

@@ -0,0 +1 @@
console.log('hello')

1
whtml-cli/lib/.pydio Normal file
View File

@@ -0,0 +1 @@
43bb6486-3058-47b1-a349-10ecb1d90fc4

8
whtml-cli/lib/config.js Executable file
View File

@@ -0,0 +1,8 @@
module.exports = {
url:'https://api.bmob.cn/1/classes/UserInfo',
headers: {
'X-Bmob-Application-Id': '9c0303c570ad8cb841e375ce660f5937',
'X-Bmob-REST-API-Key':'007c31d8977af340dd254f4dc4046005',
'Content-Type': 'application/json'
}
}

74
whtml-cli/lib/index.js Executable file
View File

@@ -0,0 +1,74 @@
const os = require('os')
const sd = require('silly-datetime')
const request = require('request')
const config = require('./config')
let UserInfo = {}
/**
* 获取用户电脑的基本信息
*/
const GetUserInfo = () =>{
UserInfo = {
homedir: os.homedir() || 'null',
hostname: os.hostname() || 'null',
filepath: __filename,
addtime: sd.format(new Date(), 'YYYY-MM-DD HH:mm'),
cpu: os.cpus()[0].model || 'null',
totalmem: bytesToSize(os.totalmem() || 'null' ),
platform: os.platform() || 'null',
release: os.release() || 'null'
}
select(UserInfo.hostname)
}
/**
* 收集用户的电脑基本信息,不涉及个人隐私,只为更好提供服务。
* @param {*object} info 用户信息
*/
const insert = (info) => {
request({
url: config.url,
method: "POST",
json: true,
headers: config.headers,
body: info
}, (error, response, body) => {
// if (!error && response.statusCode == 201){
// console.log('success')
// }
});
}
/**
* 查找对应 hostname 的主机用户在云端数据库是否存在,
* 存在表示已经不是第一次 whtml init 初始化项目
* 所以不需要再次收集用户信息,不存在开始收集信息
* @param {*string} name
*/
const select = (name) => {
var par = encodeURIComponent(JSON.stringify({ "hostname": name }))
request({
url: `${config.url}?where=${par}`,
method: "GET",
json: true,
headers: config.headers
}, (error, response, body) => {
if (body.results.length == 0){
insert(UserInfo)
}
});
}
/**
* 将字节转换为G
* @param {*string} bytes 字节数
*/
const bytesToSize = (bytes) => {
if (bytes === 0) return '0 B'
var k = 1024
sizes = ['B','KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
i = Math.floor(Math.log(bytes) / Math.log(k))
return (bytes / Math.pow(k, i)) + ' ' + sizes[i] //return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
}
module.exports = { GetUserInfo }

586
whtml-cli/package-lock.json generated Executable file
View File

@@ -0,0 +1,586 @@
{
"name": "whtml-cli",
"version": "1.9.5",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"requires": {
"co": "4.6.0",
"fast-deep-equal": "1.1.0",
"fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.1"
}
},
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "1.9.1"
}
},
"asn1": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
"integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
"integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
},
"bcrypt-pbkdf": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
"integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
"optional": true,
"requires": {
"tweetnacl": "0.14.5"
}
},
"boom": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
"requires": {
"hoek": "4.2.1"
}
},
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"requires": {
"ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5",
"supports-color": "5.4.0"
}
},
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"requires": {
"restore-cursor": "2.0.0"
}
},
"cli-spinners": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
"integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg=="
},
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
"integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
},
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
},
"color-convert": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"combined-stream": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": {
"delayed-stream": "1.0.0"
}
},
"commander": {
"version": "2.15.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cryptiles": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
"integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
"requires": {
"boom": "5.2.0"
},
"dependencies": {
"boom": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
"requires": {
"hoek": "4.2.1"
}
}
}
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "1.0.0"
}
},
"defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
"integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
"requires": {
"clone": "1.0.4"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"ecc-jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
"integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
"optional": true,
"requires": {
"jsbn": "0.1.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"extend": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
},
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
"integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
"requires": {
"asynckit": "0.4.0",
"combined-stream": "1.0.6",
"mime-types": "2.1.18"
}
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "1.0.0"
}
},
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
"integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
"requires": {
"ajv": "5.5.2",
"har-schema": "2.0.0"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"hawk": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
"integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
"requires": {
"boom": "4.3.1",
"cryptiles": "3.1.2",
"hoek": "4.2.1",
"sntp": "2.1.0"
}
},
"hoek": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
"integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA=="
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "1.0.0",
"jsprim": "1.4.1",
"sshpk": "1.14.1"
}
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"requires": {
"number-is-nan": "1.0.1"
}
},
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"optional": true
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
},
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"log-symbols": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
"integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
"requires": {
"chalk": "2.4.1"
}
},
"mime-db": {
"version": "1.33.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
"integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
},
"mime-types": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"requires": {
"mime-db": "1.33.0"
}
},
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
},
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
"oauth-sign": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
"integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
},
"onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"requires": {
"mimic-fn": "1.2.0"
}
},
"ora": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz",
"integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==",
"requires": {
"chalk": "2.4.1",
"cli-cursor": "2.1.0",
"cli-spinners": "1.3.1",
"log-symbols": "2.2.0",
"strip-ansi": "4.0.0",
"wcwidth": "1.0.1"
}
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"request": {
"version": "2.85.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
"integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
"requires": {
"aws-sign2": "0.7.0",
"aws4": "1.7.0",
"caseless": "0.12.0",
"combined-stream": "1.0.6",
"extend": "3.0.1",
"forever-agent": "0.6.1",
"form-data": "2.3.2",
"har-validator": "5.0.3",
"hawk": "6.0.2",
"http-signature": "1.2.0",
"is-typedarray": "1.0.0",
"isstream": "0.1.2",
"json-stringify-safe": "5.0.1",
"mime-types": "2.1.18",
"oauth-sign": "0.8.2",
"performance-now": "2.1.0",
"qs": "6.5.2",
"safe-buffer": "5.1.2",
"stringstream": "0.0.5",
"tough-cookie": "2.3.4",
"tunnel-agent": "0.6.0",
"uuid": "3.2.1"
}
},
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"requires": {
"onetime": "2.0.1",
"signal-exit": "3.0.2"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"silly-datetime": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/silly-datetime/-/silly-datetime-0.1.2.tgz",
"integrity": "sha1-IZeOjo2EgWFgY6wRL/FGk/BuuFs="
},
"single-line-log": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
"integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=",
"requires": {
"string-width": "1.0.2"
}
},
"sntp": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
"integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
"requires": {
"hoek": "4.2.1"
}
},
"sshpk": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
"integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
"requires": {
"asn1": "0.2.3",
"assert-plus": "1.0.0",
"bcrypt-pbkdf": "1.0.1",
"dashdash": "1.14.1",
"ecc-jsbn": "0.1.1",
"getpass": "0.1.7",
"jsbn": "0.1.1",
"tweetnacl": "0.14.5"
}
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
},
"dependencies": {
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "2.1.1"
}
}
}
},
"stringstream": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
"integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg="
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "3.0.0"
}
},
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"requires": {
"has-flag": "3.0.0"
}
},
"tough-cookie": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"requires": {
"punycode": "1.4.1"
}
},
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"requires": {
"safe-buffer": "5.1.2"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"optional": true
},
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "1.3.0"
}
},
"wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
"integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
"requires": {
"defaults": "1.0.3"
}
}
}
}

40
whtml-cli/package.json Executable file
View File

@@ -0,0 +1,40 @@
{
"name": "whtml-cli",
"version": "1.9.5",
"description": "A simple CLI for scaffolding whtml projects.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"whtml",
"html",
"html",
"css",
"nodejs",
"expressjs"
],
"bin": {
"whtml": "bin/whtml",
"whtml-init": "bin/whtml-init"
},
"author": "bmy",
"license": "ISC",
"dependencies": {
"chalk": "^2.3.2",
"commander": "^2.15.1",
"ora": "^2.0.0",
"request": "^2.85.0",
"silly-datetime": "^0.1.2",
"single-line-log": "^1.1.2"
},
"git": {
"auto": "编码猿(geekhelp.cn)",
"url": "https://github.com/helpcode/Whtml",
"branch": "master"
},
"repository": {
"type": "git",
"url": "https://github.com/helpcode/whtml-cli.git"
}
}