vuecli3-实现多页面应用

适用场景公司有专门的审批系统,我现在做的后台管理系统需要接入,移动端和PC端都要有一个页面来展示业务信息。后端不给开俩项目(也确实没必要),所以打算用多页面来解决,PC和移动端放到一个项目里,然后打包到各自的文件夹。 简单来说,多页面也就是适用于有多个小页面,不至于单独开多个项目的情况。 项目结构项目 src 文件夹结构如下: 打包之后 dist 文件夹结构如下: 修改哪些文件新增 utils 文件夹utils 文件夹下新增四个文件: getPages.js // 用来获取 pages 文件夹下的文件名称,vue.config.js 使用cssCopy.js // webpack 打包之后各页面的 css 文件复制到各个文件夹下jsCopy.js // webpack 打包之后各页面的 js 文件复制到各个文件夹下htmlReplace.js // 解决打包之后各页面 html 文件引入的 css、js 文件的路径问题vue.config.js为何添加 pages字段可参考 Vue 官方文档。 + let pageMethod = require('./utils/getPages.js')+ let pages = pageMethod.pages()module.exports = {- // publicPath: './', // 注意此行,会影响 htmlReplace.js 文件+ pages}注意事项每个页面的.html文件必须不能同名,不然本地开发环境无法拆分页面,本地如果想访问其他页面的话,地址如下:http://localhost:8080/order.html。 最好的处理方式是每个页面的文件夹名字和.vue名字和.html名字和.js的名字都一样,这样打包时容易拆分。 参考其实这篇文章不算原创,是参考其他文章写的,因为原文章真的是太简陋了.... 原文地址:CSDN - lizhen_software示例仓库地址:vue-more-pages

June 26, 2019 · 1 min · jiezi

为什么我要构建这个脚手架

本文不是什么技术性介绍文章,准确地说算是自己的成长记录吧。刚参加工作时,组里使用的脚手架是由 leader 使用 webpack, gulp 搭建的多页面应用脚手架 fex。当时只需知道怎么使用就行了,不过为了能更好地工作,对 fex 怎么构建一直很好奇,也一直关注相关的技术栈。经过一年多磨练后,对 fex 怎么搭建的有了个大概地认识。常言道:"没有对比就没有伤害"。 在使用 vue-cli 构建第一个 vue 项目后,对脚手架构建有了个全新的认识。发现 fex 存在很多不足: 在打包时,只对 JavaScript 和 CSS 脚本文件进行打包压缩处理。不能对资源文件(如 img,字体等)进行依赖处理。导致在打包时: 不能按需打包(即实际用到资源,才将其进行打包)不能进行 MD5 处理不能输出压缩版的 html手动注入 JavaScript 和 CSS 脚本文件,如果需要做优化,会很不方便,特别在多页面情况下。dev 与 build 使用不同的技术方案,增加定制的成本。基于 nodemon 对开发目录进行 watch,当执行修改操作时,会重启整个服务。会存在重启服务耗时比较长的情况,导致刷新页面出现空页面的情况,开发体验不是很好。缺少 code-splitting、HMR、端口检测、Babel 等功能。当然,fex 也有自己的优点。基于自建服务提供前后端复用模板功能。前端后端使用相同的模板语言,前端拼接的模板可以直接输出给后端使用。 第二年年初,组里项目不是太多,刚好有时间折腾一下,于是决定构建一个全新的脚手架 fes。为了尝试一些新东西,在技术栈上,都使用了当时最新的技术框架 webpack4、koa2、babel6 来搭建。为了了解 webpack 如何工作,对 webpack 就做了 8 次调试,才稍微对 webpack 整个架构有个初步认识。 singsong: 在真正去了解 webpack 时,才知道它有多复杂。当然也参考了网上一些大神分享关于 webpack 源码分析的文章。反正整个过程还是挺熬心的????同时,还对 koa2、babel6 做了相关的研究。附一张 koa2 分析图吧????: 为了提高 fes 开发体验,除了继承 fex 的模板复用功能外,还集成了 vue-cli 中不错的功能。 ...

June 11, 2019 · 5 min · jiezi

vue项目添加多页面配置

公司使用vue-cli创建的vue项目在初始化时并没有做多页面配置,随着需求的不断增加,发现有必要使用多页面配置。看了很多vue多页面配置的文章,基本都是在初始化时就配置了多页面。而且如果使用这些实现,需要调整当前项目的目录结构,这点也是不能接受的。 最后,参考这些文章,在不调整当前项目目录结构实现了多页面的配置的添加。这里做下记录、总结,方便以后复用。如果还能有幸帮助到有同样需求的童鞋的话,那就更好了。 实现步骤添加新增入口相关文件;使用变量维护多入口;开发环境读取多入口配置;生产环境读取多入口配置;新增入口相关文件在src目录下新增一个page1文件夹,新建新页面的所需的相关文件(入口文件、HTML模板文件等)。我这边直接vue-cli初始化创建相关文件复制了一份到page1文件夹下。如下: ├─App.vue├─main.js├─page1.html // 这里模板文件名称需要与文件夹名称相同,方便输出模板读取├─router| └index.js├─components| └HelloWorld.vue├─assets| └logo.pngpage1/router/index.js需要对该页面的所有路由添加同文件夹名的公共路径,用于解析: import Vue from 'vue'import Router from 'vue-router'import HelloWorld from '@/page1/components/HelloWorld' // 这里也需要留意Vue.use(Router)export default new Router({ mode: 'history', base: '/', routes: [ { path: '/page1/', redirect: '/page1/index' }, { path: '/page1/index', name: 'HelloWorld', component: HelloWorld } ]})使用变量维护多入口我们在项目目录下的build/utils.js的最后exports一个指定多入口的对象。如下: // 这里,每个属性就是一个页面配置,指定该页面的入口文件// 如果需要添加,只需多增加一个属性// 属性名必和html模板文件名、目录名称相同exports.multipleEntrys = { page1: './src/page1/main.js'}之所以使用build/utils.js,是因为该文件在webpack.base.conf.js、webpack.prod.conf.js、webpack.dev.conf.js都用导入。 开发环境读取多入口配置首先,在build/webpack.base.conf.js中,我们把上面定义的入口添加进entry配置: entry: { app: './src/main.js', ...utils.multipleEntrys // entry添加该行 }然后,在build/webpack.dev.conf.js添加路径解析和多页面输出: // 添加解析,将historyApiFallback的属性修改如下: historyApiFallback: { rewrites: [ // 将所有多入口遍历成路径解析项 ...((()=>{ let writes = [] for(let prop in utils.multipleEntrys){ // 使用属性名匹配为正则 // 这就是上面“需要对该页面的所有路由添加同文件夹名的公共路径”的原因 let reg = new RegExp(`^/${prop}/`) writes.push({ from: reg, // 使用属性名读取模板文件 // 这就是上面“模板文件名称需要与文件夹名称相同”的原因 to: path.posix.join(config.dev.assetsPublicPath, `${prop}.html`) }) } return writes })()), // 匹配所有路径一定要在最后,否则该匹配之后的项,不会被执行 { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') } ], }// 在已经的HtmlWebpackPlugin中添加chunks配置,否则默认页面会注入所有页面的js文件...plugins: [ ... new HtmlWebpackPlugin({ filename: 'index.html', template: 'index.html', inject: true, // 增加此行, // 'app'为默认入口名称,如果你的默认入口不是'app' // 则这里需要替换 chunks: ['manifest', 'vendor', 'app'] }) ...]...// 在`devWebpackConfig`定义之后,紧接着添加多页面输出:for(let prop in utils.multipleEntrys){ devWebpackConfig.plugins.push(new HtmlWebpackPlugin({ filename: `${prop}.html`, // html模板路径,使用属性名作为文件夹名称 // 这是新页面文件夹名称需要和多入口配置变量属性名相同的原因 template: `./src/${prop}/${prop}.html`, inject: true, chunks: ['manifest', 'vendor', prop], }))}最后,添加多页面相互跳转链接: ...

May 22, 2019 · 2 min · jiezi

Vue CLI 3 多页应用项目的搭建

在项目初期时,从零开始搭建和配置本地前端开发环境是一项很繁琐的工作,需要考虑到项目目录结构、项目基本配置、Webpack 配置等等。通过 Vue CLI 3 可以快速的生成一个项目,这样我们就可以专注在写应用上,而不必将大量时间花费在配置上。但是官方的 vue create 命令只能快速地建立一个单页应用的原型,想要开发多页应用还需要再配置一些东西。可同时支持less,sass。说明Vue CLI 3 多页应用项目**Git地址: https://github.com/zydemail/v…。初始化git clone https://github.com/zydemail/vue-mpa.gitcd vue-mpanpm install使用开发:本地运行:npm run serve:dev 注:本地开发调试服务器接口需开启浏览器跨域,可在 Chrome 应用商店安装 Allow CORS: Access-Control-Allow-Origin 插件即可解决修复代码格式错误:npm run lintfix打包:开发环境: npm run dev测试环境: npm run build:tests生产环境: npm run build:prod目录结构说明│ .browserslistrc // 配置目标浏览器│ .env.development // 开发环境配置,可在此配置全局变量,使用 process.env 读取,打包工具会根据不同环境自动读取变量│ .env.localdev // 本地开发环境配置,可在此配置全局变量,使用 process.env 读取,打包工具会根据不同环境自动读取变量│ .env.production // 生产环境配置,可在此配置全局变量,使用 process.env 读取,打包工具会根据不同环境自动读取变量│ .env.tests // 测试环境配置,可在此配置全局变量,使用 process.env 读取,打包工具会根据不同环境自动读取变量│ .eslintrc.js // eslint 配置│ .gitignore│ .postcssrc.js // postcss配置,一般不会用到,使用默认值│ babel.config.js // babel配置,一般不会用到,使用默认值│ package-lock.json│ package.json│ README.md│ title.js // 统一配置生成页面的 title│ vue.config.js // vue 配置,可配置 webpack 等,可参照 https://cli.vuejs.org/zh/config/│ ├─public // 此文件夹下可以放置一些静态资源,除了index.html会经过处理外,其他文件都会原封不动的自动复制到 htdocs 根目录下,不会经过 webpack 的处理。│ favicon.ico│ index.html // 所有的打包页面都会经过这个文件,本模板对多页的配置采用了统一处理,当然也可以在 vue.config.js 单独配置每个页面,可参照 https://cli.vuejs.org/zh/config/#pages│ ├─src // 源代码文件夹│ ├─assets // 资源文件夹,可放置 css、images等│ │ logo.png│ │ │ ├─components // 组件文件夹,可定义一些公共组件│ │ Header.vue│ │ │ ├─pages // 页面文件夹,每个页面都是一个文件夹│ │ ├─about // about 页面│ │ │ app.js // 一般不做更改│ │ │ app.vue // 页面的 html、css、js 都写在这个文件里│ │ │ │ │ ├─index│ │ │ app.js│ │ │ app.vue│ │ │ │ │ └─user│ │ └─index│ │ app.js│ │ app.vue│ │ │ ├─style // 公共样式文件夹,可以定义一些公共样式,如浏览器重置样式 reset.less,此文件夹可按需求随意更改 │ │ │ index.less│ │ │ │ │ └─core│ │ index.less│ │ reset.less│ │ │ └─utils // 常用 js 工具类│ └─core│ http.js // http 请求库,封装 axios,可直接调用│ └─tests // 单元测试,可忽略 └─unit .eslintrc.js ...

December 29, 2018 · 1 min · jiezi