项目结构
┌─operate-pc
|--build // 构建脚本目录
| |--build.js // 生产环境构建脚本
| |--utils.js // 构建相关工具方法
| |--vue-loader.conf.js // vue-loader配置
| |--webpack.base.conf.js // webpack基础配置
| |--webpack.dev.conf.js // webpack开发环境配置
| |--webpack.prod.conf.js // webpack生产环境配置
|--config // 项目配置文件
| |--dev.env.js // 开发环境变量
| |--index.js // 项目配置文件
| |--prod.env.js // 生产环境变量
|--dist // 打包后文件
|--node_modules // 依赖,安装包自动生成
|--public // 公共入口管理
| |--index.html // 模板入口页面
| |--favicon.ico // 网站头像,无时,打开页面报404
|--src // 源码目录
| |--assets // 项目静态资源文件目录,例如静态css、图片等,会被webpack构建,用来存放自己的文件
| | |--style // 静态css
| | | |--variables.scss // 全局注入样式
| | | |--common.scss // 全局公共样式
| | |--image // 图片
| |--components // 公共组件目录,里面是一个个的公共组件
| |--config // 一些配置项、工具类以及外部库
| | |--utils.js // 公共方法、会被挂载到 Vue 原型\$utils 上
| | |--filters.js // 公共过滤器
| | |--env.js // 配置编译环境
| |--constant // 常量
| | |--modules // 各模块常量
| | |--common.js // 公共常量定义
| | |--area.json // 地区枚举
| | |--index.js // 整合所有常量
| |--mixins // 混入功能
| | |--routeHijack.js // 处理路由,keep-alive不同情况处理
| |--pages // 业务逻辑页面存放文件
| | |--appMain.vue // 顶部及左侧导航页面
| | |--index.vue // 入口页面
| |--plugin // 插件管理
| | |--src // 各模块路由封装
| | | |--directives.js // 页面权限点、拖拽等指令定义
| | | |--protos.js // 存放Vue原型的方法
| | |--index.js // 埋点、全局公共组件、过滤器、指令等定义
| |--router // 页面路由配置
| | |--modules // 各模块路由封装
| | | |--notcheck.js // 不添加前缀路由
| | |--index.js // 路由整合
| | |--routes.js // 路由前缀处理等
| |--service // 网关接口管理
| | |--modules // 各模块接口封装
| | | |--common.js // 公共接口请求
| | |--http.js // 封装axios及接口返参了拦截等
| | |--index.js // 整合所有接口能力
| |--store // 状态管理目录
| | |--modules // 各模块状态封装
| | | |--app.js // 全局状态管理
| | |--index.js // 整合所有状态管理能力
| | |--initStore.js // 初始化菜单权限管理
|--APP.vue // 页面入口文件
|--main.js // 入口文件,初始化vue实例、定义全局组件等
|--.babelrc // babel 规则配置
|--.editorconfig // 统一代码风格配置文件
|--.eslintignore // eslint忽略文件
|--.eslintrc.js // eslint规则添加
|--.gitignore // git 忽略文件
|--.gitlab-ci.yml // 自动部署 ci/cd 项目发布
|--.postcssrc.js // CSS预处理器(此处默认启用autoprefixer)
|--.prettierrc.js // prettier配置格式化规范
|--package.json // npm包配置文件,里面定义了项目的npm脚本,依赖包等信息
|--package-lock.json // npm包锁定依赖版本
└─README.md // 项目说明
基础框架搭建
- 创建 package.json
npm init // 可以设置项目名,作者,关键词等
- 安装 webpack 依赖
npm install -D webpack
npm install -D webpack-cli
npm install -D webpack-dev-server
npm install -D webpack-merge
- 安装 vue / vuex / vue-router
- vue: UI框架
- vue-loader:vue 组件转义
- vue-template-compiler:读取处理了.vue文件SFC内容,将.vue文件处理为一个AST树。
- vuex:状态管理
- vue-router:路由管理
npm install --save vue
npm install -D vue-loader
npm install -D vue-template-compiler
npm install --save vuex
npm install --save vue-router
- 安装 babel
- babel-loader:转义 js 文件代码的 loader
- @babel/core:babel 核心库
- @babel/preset-env:整合es6语法转义
- @babel/plugin-transform-arrow-functions:箭头函数转义
- @babel/plugin-transform-classes:class转义
- @babel-polyfill:使用新的 API 时兼容老版浏览器,会污染全局变量,移除,通过下面插件实现
- @babel/plugin-transform-runtime:外部化对助手和内置函数的引用,自动填充代码,而不会污染全局变量
- @babel/runtime:替代polyfill。提取辅助函数,运行时转义减小项目文件的大小
- polyfill-service:通过选择性地填充浏览器所需的内容,使Web开发的烦恼程度降低。读取每个请求的User-Agent标头,并返回适合于请求浏览器的polyfill。只需在index.html中引入即可,暂未测试。
- babel-plugin-import:主动注入依赖
- @babel/plugin-syntax-dynamic-import:动态注入插件
npm install -D babel-loader
npm install -D @babel/core
npm install -D @babel/preset-env
npm install -D @babel/polyfill // 已除掉
npm install -D @babel/plugin-transform-runtime
npm install --save @babel/runtime
npm install -D babel-plugin-import
npm install -D @babel/plugin-syntax-dynamic-import
-
安装一些公司内部公共组件库,如:公共工具库、UI样式库、埋点库等。
-
安装axios,发送 ajax 请求
npm install --save axios
- 安装 sass 使用
- css-loader,style-loader:处理css基础loader
- node-sass,sass-loader:处理sass
- sass-resources-loader:全局注册sass变量
- postcss-loader,autoprefixer,postcss-import:自动给css样式添加前缀,兼容浏览器
- postcss-import:更有效的引入内联样式表的方法;可以引入第三方样式表;可以将样式表分割成多个部分,然后重新组合它们
- postcss-url:url上重新定位、内联或者复制
- mini-css-extract-plugin:提取css
- optimize-css-assets-webpack-plugin:压缩css
npm install -D style-loader css-loader
npm install -D node-sass sass-loader
npm install -D sass-resources-loader
npm install -D postcss-loader autoprefixer
npm install -D postcss-import postcss-url
npm install -D mini-css-extract-plugin
npm install -D optimize-css-assets-webpack-plugin
- compression-webpack-plugin gzip压缩插件
npm install -D compression-webpack-plugin
- file-loader及url-loader
- url-loader:将引入的图片编码,生成dataUrl并将其打包到文件中,图片过大,编码消耗性能,需要通过limit进行大小限制,超过使用file-loader,url-loader内部封装了file-loader,故安装时只需按照url-loader
- file-loader:修改打包后图片的存储路径,通过配置修改引用路径。
npm install -D url-loader file-loader
- friendly-errors-webpack-plugin
- 识别某些类别的webpack错误,并清理,聚合和优先级
npm install -D friendly-errors-webpack-plugin
- html-webpack-plugin
- 创建一个
html文件,并把webpack打包后的静态文件自动插入到这个html文件当中。
- 创建一个
npm install -D html-webpack-plugin
- node-notifier:发送跨平台本机通知。
npm install -D node-notifier
- portfinder
- 本地开发启动多个端口,如果指定端口被占用,则端口号+1,不是管理员权限时,端口不能小于1024。脚手架端口号最低从1024启动。
npm install -D portfinder
- shelljs:脚本语言解析器,可用于自动化。
npm install -D shelljs
- terser-webpack-plugin:缩小js
npm install -D terser-webpack-plugin
- vue相关插件
- vue-loader:将解析文件,提取每个语言块,如有必要,将它们通过其他加载器进行管道传输,最后将它们组装回ES 模块,其默认导出为 Vue.js 组件选项对象。
- vue-template-compiler:将模板预编译为渲染函数
- vue-style-loader:vue 样式解析
- vue-infinite-scroll:无限滚动,下拉加载
npm install -D vue-loader
npm install -D vue-template-compiler
npm install -D vue-style-loader
npm install -D vue-infinite-scroll
- eslint & prettier:校验添加,通一代码风格
npm install -D eslint-loader babel-eslint
npm install -D eslint eslint-config-standard eslint-friendly-formatter eslint-plugin-html eslint-plugin-import eslint-plugin-node eslint-plugin-promise eslint-plugin-standard eslint-plugin-vue
npm install -D prettier-eslint-cli
- copy-webpack-plugin:文本拷贝
npm install -D copy-webpack-plugin
- chalk:修改控制台中字符串的样式
npm install -D chalk
npm install -D husky lint-staged
- @vue/babel-preset-jsx:解析jsx
npm install -D @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
- Web-storage-cache:js缓存
npm install -D web-storage-cache mome
配置文件详解
- .babelrc
- 解析es6规则
{
// 定制转码规则
"presets": [
[
"@babel/preset-env", // 将js转码为es5,并且设置不转码的AMD的模块文件,制定浏览器兼容
{
"loose": true,
"modules": false // 默认都是支持 CommonJS
}
]
],
"plugins": [
"@babel/plugin-transform-runtime", // 解决全局对象等编译不足,不会污染全局 API。
[
"import",
{
"libraryName": "@zyf2e/utils",
"camel2DashComponentName": false
},
"@zyf2e/utils"
]
]
}
- .editorconfig:编辑器的配置文件
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
-
.eslintignore:eslint校验忽略配置文件
-
.eslintrc.js:eslint规则添加
// https://eslint.org/docs/user-guide/configuring
module.exports = {
// 默认情况下,ESLint会在所有父级组件中寻找配置文件,一直到根目录。ESLint一旦发现配置文件中有 "root": true,它就会停止在父级目录中寻找。
root: true,
parserOptions: {
// 对Babel解析器的包装使其与 ESLint 兼容。
parser: 'babel-eslint'
},
// 可配置全局变量
globals: {
util: true,
Telescope: true,
tryCatch: true
},
env: {
// 浏览器环境中的全局变量
browser: true,
// Node.js 全局变量和 Node.js 作用域
node: true
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// 扩展一个流行的风格指南,即 eslint-config-standard
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: ['vue'],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off', // 取消generator 函数中 * 号周围使用一致空格的规则
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', // 生产环境禁用debugger
semi: ['error', 'always'] //必须使用分号
}
};
-
.gitignore:git提交忽略文件配置
-
.gitlab-ci.yml:gitlab自动部署 ci/cd 项目发布配置
-
postcssrc.js :postcss-loader包的一个配置,写入使用到的插件
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
- .prettierrc.js:美化代码风格
module.exports = {
tabWidth: 2,
semi: true,
singleQuote: true,
jsxSingleQuote: true,
proseWrap: 'never',
bracketSpacing: true,
jsxBracketSameLine: false,
trailingComma: 'none',
printWidth: 120,
htmlWhitespaceSensitivity: 'ignore', //vue-html尖括号掉行
'space-before-function-paren': 0
};
- pakage.json:项目基本配置信息,控制台运行脚本,项目依赖库及开发依赖库。
- scripts配置dev
- inline:将webpack-dev-server客户端加入到webpack入口文件的配置中
- progress:将运行进度输出到控制台
- port:指定端口号,非管理员权限,端口号从1024开始。
- scripts配置dev
{
"name": "operate-pc",
"version": "1.0.0",
"description": "管理后台",
"main": "index.js",
"scripts": {
"dev": "webpack-dev-server --inline --progress --config ./build/webpack.dev.conf.js", // 开发环境
"start": "sudo npm run dev",
"build": "node build/build.js", // 打包命令
"prettier-fix": "prettier --write src/**/*.{vue,js,less,scss} *.html",
"eslint-fix": "eslint src/**/* --fix",
"fix": "npm run prettier-fix&&npm run eslint-fix" // 格式化代码
},
"keywords": [
"管理后台",
"vue"
],
"author": "xxx",
"license": "ISC",
"dependencies": {
"@babel/runtime": "^7.11.2",
"axios": "^0.20.0",
"vue": "^2.6.12",
"vue-router": "^3.4.3",
"vuex": "^3.5.1"
},
"devDependencies": {
"@babel/core": "^7.11.4",
"@babel/plugin-transform-runtime": "^7.11.0",
"@babel/preset-env": "^7.11.0",
"@zyf2e/utils": "^2.3.37",
"autoprefixer": "^9.8.6",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0",
"babel-plugin-import": "^1.13.0",
"chalk": "^4.1.0",
"copy-webpack-plugin": "^5.0.2",
"css-loader": "^4.2.2",
"eslint": "^7.7.0",
"eslint-config-standard": "^14.1.1",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^4.0.2",
"eslint-plugin-html": "^6.0.3",
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"eslint-plugin-vue": "^6.2.2",
"file-loader": "^6.0.0",
"friendly-errors-webpack-plugin": "^1.7.0",
"html-webpack-plugin": "^4.3.0",
"mini-css-extract-plugin": "^0.10.0",
"node-notifier": "^8.0.0",
"node-sass": "^4.14.1",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"portfinder": "^1.0.28",
"postcss-import": "^12.0.1",
"postcss-loader": "^3.0.0",
"postcss-url": "^8.0.0",
"prettier-eslint-cli": "^5.0.0",
"sass-loader": "^10.0.1",
"sass-resources-loader": "^2.1.0",
"shelljs": "^0.8.4",
"style-loader": "^1.2.1",
"terser-webpack-plugin": "^4.1.0",
"url-loader": "^4.1.0",
"vue-infinite-scroll": "^2.0.2",
"vue-loader": "^15.7.0",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.12",
"webpack": "^4.44.1",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.0",
"webpack-merge": "^5.1.2"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}