diff --git a/.env b/.env
index b24896b..4a2c246 100644
--- a/.env
+++ b/.env
@@ -2,13 +2,13 @@
# 注释只能在单独的一行里($需要转义: \$)
APP_NAME=vue-tpl
-APP_VERSION=1.2.10
-# 发布地址(建议相对路径, 比如 '' './')
+# APP_VERSION: 自动从 package.json version 字段获取
+# 静态资源路径(开发环境的相对路径只支持'', 不支持./../等)
BASE_URL=''
# 接口地址(hash路由建议相对路径)
BASE_PATH=api
-# 皮肤文件夹相对路径(其下的文件夹里只要没有index.scss就不会被识别为皮肤)
+# 皮肤文件夹相对别名的路径(其下的文件夹里只要没有index.scss就不会被识别为皮肤)
SKIN_DIR=skin
# 默认皮肤名 camelCase(多皮肤):SKIN_DIR/SKIN(/index)?.scss falsy(单皮肤):SKIN_DIR(/index)?.scss
SKIN=light
@@ -24,4 +24,4 @@ SEARCH_FIELD=_target\d+
# [别名, 路径(相对根目录或入口), 默认指令(可省略)] 或者
# [别名, 路径, [允许的指令, ...], 默认指令(可省略)]
# ... ], 可使用cli命令指定指令(优先 --alias=foo.bar,bar.foo )
-_ALIAS=[["@iRoute", "index/route"]]
+_ALIAS=[["@iRoute", "index/route"], ["@oRoute", "other/route"]]
diff --git a/.env.development b/.env.development
index f9a55b2..97e8fc6 100644
--- a/.env.development
+++ b/.env.development
@@ -3,11 +3,11 @@
# import() => require(), 提高热更新速度, https://github.com/vuejs/vue-cli/blob/master/packages/@vue/babel-preset-app/index.js#L134
VUE_CLI_BABEL_TRANSPILE_MODULES=true
-# 服务主机,默认0.0.0.0(可通过localhost和ip访问), 默认打开优先ip
-DEV_SERVER_HOST=0.0.0.0
+# 服务主机,默认0.0.0.0(优先ip)
+# DEV_SERVER_HOST=0.0.0.0
# DEV_SERVER_NETWORK=IPv6
# 服务端口,默认9000
-DEV_SERVER_PORT=9000
+# DEV_SERVER_PORT=9000
# 默认打开页 默认/
# DEV_SERVER_PAGE=/
# 是否使用https (不支持http2) 默认false
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e4ac64..7609d13 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# 更新日志
+## v 1.2.17
+
+- 完善多SPA支持
+
## v 1.2.16
- 文件/图片数据仓库, 下载任务增加禁用缓存选项
diff --git a/README.md b/README.md
index af595f6..ed8c3dc 100644
--- a/README.md
+++ b/README.md
@@ -194,7 +194,7 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
支持通过浏览器地址栏动态传递调试参数
-- 环境变量`SEARCH_FIELD`: **所有**ajax请求将会把满足该正则的参数传递给服务端(开发环境代理服务器)
+- 环境变量`SEARCH_FIELD`: **所有**ajax请求将会把满足该正则的参数传递给服务端
- 动态代理字段, 通过`PROXY_FIELD`指定, 数字与静态代理(`BASE_PATH` + `PROXY_TARGET`)一致, 可以指定为环境变量名(比如 PROXY_TARGET)/ip/域名/完整url. 匹配的代理字段将**不会**传递给服务器
@@ -207,6 +207,8 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
# PROXY_TARGET1=https://bar.com:999/bar
# PROXY_FIELD=proxy
# SEARCH_FIELD=$PROXY_FIELD\d*
+
+ # 访问如下url:
http://{ip}:{port}/{path}?proxy=http://127.0.0.1/foo&proxy1=0.0.0.0
# 结果: BASE_PATH 为 foo 的接口代理到 http://127.0.0.1/foo
# BASE_PATH 为 bar 的接口代理到 https://0.0.0.0:999/bar
@@ -217,20 +219,20 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
### 目录结构
```bash
-├── public # 静态文件目录, 除特殊文件(比如 html 模板)外, 直接复制到输出目录下
+├── public # 静态文件目录, 除SPA模板(*.html)外, 直接复制到输出目录下
├── src # 源码目录
│ │── api # http通信
│ │── assets # 静态资源文件目录, 使用到的会被解析处理(比如图片等)
-│ │── components # 从views/pages提取的复用组件(建文件夹分类, 未分类的基本就是基础组件了)
-│ │── functions # 从views/pages提取的复用逻辑(建文件夹分类, 未分类的基本就是公用逻辑了)
-│ │── config # 配置目录
+│ │── components # 提取的复用组件(文件夹分类, 未分类的基本就是基础组件了)
+│ │── functions # 提取的复用逻辑(文件夹分类, 未分类的基本就是公用逻辑了)
+│ │── config # 配置目录(输出到内联js, 可以直接修改而不用重新打包)
│ │── enums # 枚举目录
│ │── lang # 多语言目录
│ │── libs # 存储不(能)通过 npm 管理的第三方库/依赖库等相关
│ │── scss # 样式/CSS 对象(.module).scss 文件
-│ │── skin # 皮肤(scss变量) 文件
+│ │── skin # 皮肤文件(夹)
│ │── route # 路由配置
-│ │── router # 路由设置
+│ │── router # 路由逻辑
│ │── store # 状态管理
│ │ └── modules # 各模块状态管理
│ │── types # ts 接口/申明文件
@@ -242,12 +244,14 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
├── tests # 测试用例目录
│ │── e2e # e2e 测试(cypress): https://www.cypress.io
│ └── unit # unit 测试(jest): https://jestjs.io
-├── build # 工具类脚本
-├── .env # 所有环境的环境变量(可通过 process.env 访问)
-├── .env.[mode] # 指定环境的环境变量
-├── .env.*.local # 本地环境变量(git忽略)
-├── ... # 配置文件
-└── vue.config.js # 工程(vue cli)配置入口
+├── build # 脚本
+│ └── ~fileName # 部署文件chunk名字典
+├── dist # 生成的部署文件目录
+├── .env # 所有环境的环境变量(满足正则/^[A-Z]+(?:_[A-Z]+)?$/的可通过process.env访问)
+├── .env.[mode] # 指定环境的环境变量(mode: development/production/test)
+├── .env.local/env.[mode].local # 本地环境变量(git忽略)
+├── ... # 其他配置文件
+└── vue.config.js # 配置入口(vue cli)
```
> 目录结构说明:
@@ -264,13 +268,13 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
2. 已有目录别名如下:
- - `@` -> `src`
- - `@com` -> `src/components`
- - `@{entry}` -> 页面入口文件所在目录, 如: `@index`
- - `@{entry}Com` -> 页面入口文件所在目录下的 `components` 目录(若存在), 如: `@indexCom`
- - [路由配置别名](#指定路由配置通过别名)
+ - `@` => `src`
+ - `@com` => `src/components`
+ - `@{entry}` => 页面入口文件所在目录, 如: `@index`
+ - `@{entry}Com` => 页面入口文件所在目录下的 `components` 目录(若存在), 如: `@indexCom`
+ - [配置的别名](#指定路由配置通过别名)
- **Tips**: 在 `scss` 中使用 `~` 解析 `别名`/`依赖包` 对应目录. 示例:
+ **Tips**: 在 `scss` 中使用 `~` 解析 `别名`/`依赖包`, 示例:
```html
@@ -282,7 +286,6 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
@@ -293,13 +296,12 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
```
-3. 输出目录为 `dist`, 包含 js/css/img/font/media 等文件夹
-4. `config` 目录下的所有内容都会被内联到对应`html`中(需要保留的注释请使用: `/*! 注释内容 */`), 用于支持直接修改配置而不必重新打包代码
-5. 测试用例目录层级与文件名应尽量与源码对应
+3. `config` 目录下的所有内容都会被内联到对应`html`中(需要保留的注释请使用: `/*! 注释内容 */`), 用于支持直接修改配置而不必重新打包代码
+4. 测试用例目录层级与文件名应尽量与源码对应
> **提示和建议**
-- 新建目录时尽量复用上述列出的目录名, 保证结构清晰的情况下减少目录层级
+- `src`下新建目录时应尽量复用现有目录名, 在保证结构清晰的情况下减少目录层级
- 目录及文件命名:
**文件夹及其它文件**(js/scss/图片等)使用 `camelCase` (即: 首字母小写驼峰 = lowerCamelCase)
@@ -317,14 +319,14 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
│── Item.vue
└── ...
- // 使用组件
+ // 使用BillList组件
import BillList from '{path}/BillList'
```
- **先设计**功能模块/组件再(目录层级)向下细分或向上提取
- 越接近 src 目录的, 测试覆盖率也应越高; 被测试的代码应加注释`@test: true`表示在对应目录下包含测试用例, 否则指明测试代码路径或就近建`__tests__`目录; 修改了测试覆盖的代码后, 应视情况增加测试内容
-- 尽量**不要使用全局注册**(插件/组件/指令/混入等)以优化性能及chunk并且代码更清晰、易维护
-- 尽量**按照依赖库的文档描述**来使用她, 从其源码(src)引入模块(css/scss/.../js/mjs/ts/jsx/tsx/vue), 将可能**不会被转译**且更可能随版本更新改变, 需要时可以从其构建后的 lib/dist 等目录引入或者增加一些配置(需要了解模块解析及转码规则和相关插件, 不推荐)
+- 尽量**不要使用全局注册**(插件/组件/指令/混入等)以优化性能并且代码更清晰、更易维护
+- 尽量**按照依赖库的文档描述**来使用她, 从其源码(src)引入模块(css/scss/.../js/mjs/ts/jsx/tsx/vue), 将可能**不会被处理**且更可能随版本更新改变, 需要时可以从其构建后的 lib/dist 等目录引入或者增加一些配置(需要了解模块解析及转码规则和相关插件, 不推荐)
- 若开发环境出现缓存相关错误信息导致热更新慢, 可以删除 `node_modules/.cache` 文件夹再试
### 风格建议
@@ -343,7 +345,7 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
- 另请参考: [vue 风格指南](https://cn.vuejs.org/v2/style-guide/) **推荐(C)及以上** 和 [stylelint](https://github.com/stylelint/stylelint/blob/master/docs/user-guide/rules.md) [配置](.stylelintrc.js)
- 请直接使用`ES6+`, 除了`Proxy`等极少数不能shim和polyfill的(实际业务也极少用到), 不需要考虑兼容, 也不要做没必要/效果微弱的的优化(我检讨), 优先考虑代码**可读性**
- 引用 `vue/tsx/ts/js/jsx` **不要加文件扩展名** 且省略 `/index`, 有利于重构代码
-- 在`tsx/jsx`中使用全局注册的组件时可以使用`kebab-case`, 否则会在控制台输出错误 ┐(: ´ ゞ`)┌
+- 在`tsx/jsx`中使用**全局组件**时应使用`kebab-case`, 否则会在控制台输出错误 ┐(: ´ ゞ`)┌
```TypeScript
import { CreateElement } from 'vue'
@@ -352,7 +354,6 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
@Component
export default class extends Vue {
private render(h: CreateElement) {
-
return (
这是个按钮
@@ -365,25 +366,25 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
- `enum/type/interface` 需要导出的直接 `export` (否则可能会得到 undefined), 其他的除了字典(硬编码)和只有默认导出的外, 先定义再`export`(IDE 提示更友好), 并且`export`语句放到最后
- 不要使用 `$` 作为组件事件名, 该名字已被[异步组件刷新](src/components/hoc)占用
- **私有属性**命名规则(避免 [属性名](https://cn.vuejs.org/v2/style-guide/#私有属性名-必要) 冲突):
- - `$_` 实例命名空间(在保证易维护的前提下可以使用单字母, 但应尽量避免)
- - `_$` **全局/跨组件/hack**命名空间, 命名前应**先全局搜索**是否有重复
- - `/^[$_]+_$/` 注入**vue data 选项**命名空间应满足该正则, 即以`_`结尾(因为以`$_`其中一个字符开头的Vue不会劫持), 命名前应**先全局搜索**是否有重复
+ - `$_` 实例属性名前缀(在保证易维护的前提下可以使用单字母, 但应尽量避免)
+ - `_$` **全局/跨组件/hack**属性名前缀, 命名前应**先全局搜索**是否有重复
+ - `/^[^$_]+_$/` 注入**vue data 选项**的属性名应满足该正则, 即以`_`结尾(以`$_`其中一个字符开头的Vue会略过), 命名前应**先全局搜索**是否有重复
-- 除了以下样式可以使用全局:
+- 除了以下情况外, 不应使用全局样式:
- 浏览器默认样式重置
- - 通用`Transition` 动画样式
+ - 通用 `Transition` 动画样式
- 通用字体图标样式
- 基础组件样式(按照[BEM](https://en.bem.info)约定命名[参考链接](https://www.ibm.com/developerworks/cn/web/1512_chengfu_bem/))
- 均应使用 [CSSModule](https://vue-loader-v14.vuejs.org/zh-cn/features/css-modules.html)(开发环境class名:`[folder]__[name]_[local]-[emoji]$`), 以更好的实现模块化(支持复用)
+ 应使用 [CSSModule](https://vue-loader-v14.vuejs.org/zh-cn/features/css-modules.html)(开发环境class名:`[folder]__[name]_[local]-[emoji]$`), 以更好地实现模块化(支持复用)
- CSS Modules class 名使用 `camelCase`, 选择器嵌套**不应超过三层**
-- **皮肤文件**(scss变量) _(包含各别名下[.env](.env) `GLOBAL_SCSS`变量指定的文件)_ 中不要出现具体样式, 也不要有[`:export{}`](https://github.com/css-modules/icss#export)(应在 `scss/export` 目录下或 `export*.scss` 中使用)
-- 为保证在`ts/js`中引入scss文件时, 变量注入正确(使用缓存会导致无法对相同文件注入不同变量,不用缓存显然不合理而且也不支持), 应在合适的位置新建 scss 文件来中转:
+- **皮肤文件**(`*.scss`) _(包含各别名下GLOBAL_SCSS环境变量指定的文件)_ 中不要出现具体样式, 也不要有[`:export{}`](https://github.com/css-modules/icss#export) (`:export{}`应在 `scss/export` 目录下或 `export*.scss` 中使用)
+- 为保证在`ts/js`中引入scss文件时, 变量注入正确(使用缓存会导致无法对相同文件注入不同变量,不用缓存显然不好而且也不支持), 应在合适的位置新建 scss 文件来中转:
```scss
- // el.scss
+ /// el.scss
@import '~element-ui/packages/theme-chalk/src/button';
```
@@ -400,11 +401,10 @@ yarn vue-cli-service help # [命令] : 比如 yarn vue-cli-service help test:e2e
import ElButton from 'element-ui/lib/button'
import './el.scss'
- @Component({
- components: { ElButton },
- })
+ @Component({ components: { ElButton } })
export default class extends Vue {}
+