哇,很久没有写文章(总结)了。最近稍微有了一点点时间,也想对自己学习的知识进行系统性的总结。那么就开始搞一个有点用的东西吧:一行一行代码写一个基于vue的企业级可用前端框架。
我们从利用vue-cli手脚架工具创建项目开始,一步一步的建设我们的基础框架。首先,我会详细的讲解PCweb端项目的建设过程,并编写每一行代码。然后,在此基础上再介绍移动端web项目的建设,当然也会编写完整的代码。完整可运行的项目代码会同步推送GitHub。
GitHub地址:
大纲
此前端框架基于vue + axios + antd-vue + vue-router现实,用webpack打包。框架主要包含:
1.配置模块,主要是webpack编译打包的一些配置项;
2.HTTP请求模块,基于axios和qs的封装,主要是用于向后端发起http请求;
3.接口层模块,在这里调用http请求模块发起请求,管理每一个接口,同时包含mock数据;
4.一个自动生成接口层文件的插件,严格说这个不属于此框架的代码,打包也不会包含此代码,这只是提高开发的效率;
5.资源模块,这里主要放置一些静态的资源,如CSS、image等;
6.通用组件模块,这里主要是一些全局或多个页面都会用到的组件;
7.视图模块,此部分是最常用的开发目录,项目中的一个个页面都在这里;
8.路由模块,基于vue-router实现路由的跳转和控制,这路由的配置会用到一个叫“auto-vue-routes-plugin”的插件,它可以实现自动的配置路由,大大的提供开发效率,让人用的爽;这个插件是我老大编写的,已经提交到npm,此项目引用;
9.存储模块,主要是封装了localStorage和sessionStorage的操作,用于存储数据。这里暂时不考虑引入vuex,需要开发中大型应用又需要管理更多状态时可自行引入;
10.公共方法模块,这里主要是一些全局公共的方法,如存储处理、数据校验、数据加密、对象和数据的处理、excel处理、正则等;
11.登录模块,主要处理登录部分的一些逻辑;
12.权限模块,主要是处理数据权限的一些逻辑。
框架结构图
OK,整个业务框架基本就包含以上模块,上一个结构图,更直观一点:
安装开发工具
当然首先就是安装需要的开发工具包啦,一步一步、一个一个来。
在这过程中,我们需要理清需要什么工具,这些工具都是干什么的,为什么需要它。搞清楚这些很重要。
1. Visual Studio Code ,简称VS Code。
前端开发非常好用的一个代码编辑器。直接下载安装最新版即可。官网下载地址:https://code.visualstudio.com。
2. Node.js。
选择对应版本下载安装。我安装的版本是v12.13.0。官网下载地址:https://nodejs.org/en/。
Node.js 这个项目最初是被称为web.js,就是一个高性能的、基于事件循环的、轻量的web服务器,并提供了一套库。后来项目的发展超出了预期,已经不再是一个单纯的web服务器了,到现在已经发展为一个平台,它是一个高性能的web服务器,它能解析JavaScript语言(内封了V8引擎),它提供了一套库让JS有了I/O能力,它还包含了一个软件安装包的管理工具npm,已经变成了一个构件网络应用的基础框架。所以,在node这个平台上,你可以用JS去开发一些独立的程序,就像python、java那样,开发一些有I/O读写的可直接运行的程序(我们知道,没有node之前,JS都只能在浏览器中运行,没法开发独立可运行的程序),更重要的是可以用JS去开发后端服务,这是一个巨大的变化和创新。从此JS不再局限于浏览器了。
从上面关于node的介绍来看,这个跟我们开发web程序好像没有什么关系,web程序不需要node的啊。的确,我们开发的在浏览器中运行的web程序是不需要node的,但是我们在开发web程序的过程中,需要用到node。所以,我们要搞清楚:
生产环境并不需要node.js,只是开发的时候用。
生产环境不需要安装node.js,我们只是开发web项目的时候会用到node.js。基于vue开发的web项目,部署到生产环境的时候只需要通过CDN引入vue,或者将vue打包到项目中即可,当然如果用了其他的库同样需要引入。vue项目,其实就是个web项目,打包之后最终就是一些js文件、image文件和html文件。这些都是静态的文件,可用web服务器来运行,通常是用nginx。
我们开发的时候需要调试web程序,那么需要把web程序在一个服务器中跑起来,一般会用到一个叫 webpack-dev-server 的服务器(下面介绍)。
项目开发完成后需要编译打包,我们会用到 webpack(下面介绍)。
而这两者都是基于node实现和运行的。管理依赖包需要npm,这也是node提供的。
所以,我们开发需要安装node。
引申问题补充说明:
(1)webpack-dev-server 是一个采用 Node.js Express 实现的微型服务器, 内部使用 webpack-dev-middleware 来响应发送到服务器监听端口的HTTP请求。它由webpack 提供,用于前端项目的本地开发和调试。详见官方文档:https://www.webpackjs.com/guides/development/#%E4%BD%BF%E7%94%A8-webpack-dev-server。
(2)Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。Express 提供精简的基本 Web 应用程序功能,而不会隐藏您了解和青睐的 Node.js 功能。
(3)Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造,致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
(4)关于package.json里面配置的依赖包,在打包的时候是否都会被打包到项目代码中?记住,webpack打包是根据入口文件递归的去生成一个依赖图,这图中出现的文件才会被打包。简单来说,就是项目中import的包才会被打包,而仅仅是在package.json里面配置的依赖包只会在npm install的时候安装到node_modules目录下面,那些在代码中被import的包会从这个目录下面寻找。
OK,安装了 VS Code 和 Node.js 我们可以进行开发了。至于上面提到webpack 、webpack-dev-server 什么的,我们利用npm在项目中再安装,而不是全局安装到系统中。这些是项目依赖的东西。
框架项目结构
1.初始化项目
初始化项目需要用到一个叫做vue手脚架的工具 vue-cli 。
vue-cli 是 vue 的脚手架,用于生成一个基于vue和webpack的项目模板。说白了,就是vue-cli是一个软件工具,利用它可以初始化生成一个vue项目,这个项目会有一些目录结构、一些配置文件,并且是利用webpack去打包。此项目已经可以直接运行,接下来可以在此基础上进行开发。
vue-cli 分为旧版本和新版本:3.x以下的是旧版本,3.x(含)以上的是新版本。由于我们安装的node版本是v12.13.0,比较高,vue-cli 3.x以下的版本用到的一些node库已经被废弃,所以,我们需要安装3.x版本。
全局安装 vue-cli,我安装的版本是 3.0.1。
打开powershell,运行命令: npm install -g @vue/cli@3.0.1 。
安装成功之后,输入 vue -V 查看版本号。可能会遇到报错,大概是:xxxxxx因为在此系统上禁止运行脚本xxx。解决方法:以管理员身份运行powershell,输入 set-ExecutionPolicy RemoteSigned ,接着输入 Y 。
再来查看版本号,成功输出:
一些补充说明:
(1)3.x 版本之后,vue-cli 的包名从 vue-cli 改成了 @vue/cli。3.x 版本新增了图形化的方式来创建项目。
(2)vue-cli 的安装:
3.0以下:npm install -g vue-cli@版本号
3.0及以上:npm install -g @vue/cli@版本号
卸载
3.0以下:npm uninstall vue-cli -g
3.0及以上:npm uninstall -g @vue/cli
查看版本号
vue -V
vue --version
(3)安装 vue-cli 之后是否自动安装了 webpack ?答:不会的。可以验证一下:
(4)不推荐全局安装webpack,webpack 作为一个项目打包工具应该跟项目走,可以用不同的版本去打包项目。而且在项目中也没有必要再去手动的安装webpack,因为用vue-cli初始化项目的时候会安装这些依赖包了,并且会生成一个 package.json 文件,此文件会记录了生成环境和开发环境需要用到的一些依赖包,其中就会包含webpack,说明webpack已经安装好了,当然也肯定会包含 vue 。这些依赖包都会下载安装在项目中一个叫 node_modules 的文件夹里面。当你把node_modules文件删除了,可以项目中运行 npm install ,便会根据 package.json 文件的记录重新下载并安装这些依赖包。
(5)webpack 是什么?webpack是一个模块打包工具,可以使用webpack管理项目中的模块依赖,并编绎输出静态文件。它能够很好地管理、打包Web开发中所用到的HTML、Javascript、CSS以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,webpack有对应的模块加载器loader。webpack模块打包器会分析模块间的依赖关系,最后生成优化且合并后的静态资源。其插件功能提供了处理各种文件过程中的各个生命周期钩子,使开发者能够利用插件功能开发很多自定义的功能。详看官网介绍:https://www.webpackjs.com/concepts/ 。
OK,接下来我们初始化一个vue项目:
首先检查一遍安装的工具,一切正常:
由于vue-cli3 初始化项目的命令与2版本不一样,但是我还是想用旧版本的vue init 功能初始化项目。
根据说明,安装@vue/cli-init即可,输入命令: npm install -g @vue/cli-init 。
OK,一切准备就绪,开始初始化项目,输入 vue init webpack admin-web-front 。
其中:vue init 是指令,webpack 是模板类型,admin-web-front 是项目名称。指令形式是 vue init <template-name> <project-name>,两种常用的模板类型: webpack-simple 和 webpack。
说明:
Vue build standalone // 独立构建;
Install vue-router? Yes // 安装路由,用于导航到不同的页面;
Use ESLintto lint your code? Yes // 安装 ESLint 代码检测工具,格式、写法等的检查,可以规范化代码;
Pick a test runner jest // 单元测试;
Setup e2e tests with Nightwatch? Yes // 端到端测试;
初始化完成,查看项目目录:
目录结构说明:
admin-web-front :
├── build # 存放构建脚本,例如 webpack 配置文件
├── config # 存放配置信息
├── node_modules # 一些依赖包
├── src # 除首页外,其他源代码
├── assets # 存放代码之外的资源,例如图片、字体
├── components # 存放除了App.vue主组件之外的其他组件,vue 组件的后缀都是 .vue
├── router # 路由
├── App.vue # 主组件
└── main.js # JS 入口文件
├── static # 存放静态资源
└── test # 单元测试代码
├── .babelrc # babel 配置文件
├── .editorconfig
├── .eslintignore
├── .eslintrc # ESLint 配置文件
├── .gitignore
├── .postcssrc
├── index.html # 首页
├── package.json # 需要的依赖包
├── package-lock.json # 项目安装的依赖包版本
└── README.md
我们打开 package.json 文件看看:
可以看到,我们在初始化项目的时候输入的一些信息都记录在这里了,指定了 vue 和 vue-router 版本 (符号 ^ 的作用是更新到主版本的最新版),一些开发的时候用到的依赖包。
继续往下看:
可以看到,package.json 文件里面开发依赖包包含了 webpack ,大版本是3。说明已经安装好 webpack了,所以这就是为什么前面会提到我们不需要在项目中再去手动的安装webpack。即使把依赖包删除了,我们只要运行 npm install 命令,package.json 里面记录的依赖包都会被安装。
OK,来验证一下:
首先看看是否安装了 webpack :
运行 npm run build,打包此vue项目:
OK,已经成功利用webpack打包项目了。
2. webpack3 升级到 webpack4
接下来再做一件事情:把webpack升级到版本4,因为注意到,官方宣传webpack4相比webpack3构建速度能够提升60%-98%,听起来真是让人心动,有什么理由不升级呢。
(1)各依赖包都需要升级,直接修改 package.json 文件 devDependencies 部分,用以下内容替换原来的:
ps: 也可以直接修改项目中各个依赖包的版本号(就是要升级版本),记得加上 "mini-css-extract-plugin": "^0.4.5" 因为原来的没有。
"devDependencies": {
"autoprefixer": "^9.3.1",
"babel-core": "^6.26.3",
"babel-eslint": "^10.0.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-jest": "^23.6.0",
"babel-loader": "^7.1.5",
"babel-plugin-component": "^1.1.1",
"babel-plugin-dynamic-import-node": "^2.2.0",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-plugin-transform-vue-jsx": "^3.7.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-2": "^6.24.1",
"babel-register": "^6.26.0",
"chalk": "^2.4.1",
"chromedriver": "^2.44.0",
"copy-webpack-plugin": "^4.6.0",
"cross-spawn": "^6.0.5",
"css-loader": "^1.0.1",
"eslint": "^4.19.1",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^4.0.0",
"eslint-loader": "^2.1.1",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^8.0.0",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^3.1.0",
"eslint-plugin-vue": "^4.7.1",
"file-loader": "^2.0.0",
"filemanager-webpack-plugin": "^2.0.5",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.4.5",
"jest": "^23.6.0",
"jest-serializer-vue": "^2.0.2",
"nightwatch": "^0.9.12",
"node-notifier": "^5.3.0",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"ora": "^3.0.0",
"portfinder": "^1.0.19",
"postcss-import": "^12.0.1",
"postcss-loader": "^3.0.0",
"postcss-px2rem": "^0.3.0",
"postcss-url": "^8.0.0",
"rimraf": "^2.6.2",
"semver": "^5.6.0",
"shelljs": "^0.8.3",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^1.1.2",
"vue-jest": "^3.0.0",
"vue-loader": "^14.2.2",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.5.17",
"webpack": "^4.26.0",
"webpack-bundle-analyzer": "^3.0.3",
"webpack-cli": "^3.1.2",
"webpack-dev-server": "^3.1.10",
"webpack-merge": "^4.1.4"
},
(2)替换插件 extract-text-webpack-plugin,使用 webpack4 推荐的插件 mini-css-extract-plugin ,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):
(3)删除 webpack.optimize.CommonsChunkPlugin 相关配置,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):
(4)增加 optimization 配置,修改文件:build/webpack.prod.conf.js (灰色底色的部分是修改的地方):
optimization: {
runtimeChunk: {
name: 'manifest'
},
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: config.build.productionSourceMap,
uglifyOptions: {
warnings: false
}
}),
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false }}
: { safe: true }
})
],
splitChunks: {
chunks: 'async',
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
name: false,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'initial',
priority: -10
}
}
}
}
(5)修改 utils 配置,修改文件:build/utils .js (灰色底色的部分是修改的地方):
(6)增加 mode 配置,修改文件:build/webpack.base.conf.js(灰色底色的部分是修改的地方):
(7)在 .babelrc 文件添加 transform-es2015-modules-commonjs,主要是解决 export 和 import 共用导致不兼容而引起的错误:
最后,删除 package-lock.json 文件和 node_modules目录,最后运行 npm install ,等待安装完成即可。
OK, 一切都改好了,我们来跑起初始化的vue项目,运行 npm run dev。
在浏览器输入:http://localhost:8080 ,OK,可以看到项目已经跑起来并且可以访问了:
3. 按划分的模块调整项目结构
娃等我很久了,先跟他玩玩,今晚继续这部分内容。
提取公共代码:通用组件、公共方法、自动生成接口层文件的插件、http请求、数据存储。
做成单独的项目,打包编译,然后在具体项目中引入。
总结
OK,万事开头难,这头我们已经开好了。
本篇文章首先介绍了将要开发的前端框架主要包含配置模块、HTTP请求模块、接口层模块、资源模块、通用组件模块、路由模块、视图模块、存储模块、公共方法模块、登录模块、权限模块和一个自动生成接口层文件的插件。
接着介绍了需要的开发工具包并讲解了每个工具的作用。
最后利用vue-cli初始化项目并调整目录结构。还介绍了如何把webpack3升级到webpack4。
题外话:其实如果仅仅是为了跑起一个vue项目,可以简单很多的,需要的工具都安装新版本,初始化,运行即可。我这里整的这么复杂,一来,我比较喜欢旧的项目结构,二来,换webpack版本、换node版本等这些在工作中可能都会遇到,在这里可以找到答案,三来,折腾得越多,对用到的工具就更加了解。
备注:
1.项目未上传GitHub (文章开头的GitHub地址未添加),等调整完结构再上传;
2.项目结构未调整;
3.项目的配置问题,等到后面处理配置模块的时候再进行优化处理;软件工程领域的经验:不要过早的优化,在项目的初期不要把知道的优化点都加入到项目中,这样会增加项目的复杂度而且也没有多大的优化效果,等项目到了一定的规模,性能问题会随之而来,然后再针对性的优化,效果自然是最理想的。