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 {} +