前言

想想也已经做过不少架构的项目了,有基于vue,基于react,基于thinkPHP,基于laravel的。

做多了,也就对现有的架构有各种想法,有好的,有坏的,总之,用起来还是不爽。vue-cli虽然可以很快地构建并使用,尤其是vue-cli v3.0,把webpack都封进@vue/cli的sdk里了,用起来更加干净、简洁。

但是,对于爱折腾的我们,好吧,开个玩笑。重来,但是,对于页面的优化,还有项目的架构,我们不得不做多多少少的修改。

好了,介绍完毕,接下来,我就从零开始,一步一步建起前后端完全分离的前端架构了。

步骤

由于要介绍的很多,全写在一篇里,有些太长了。

所以,我会分为:

创建开发环境下的webpack配置文件

配置eslint、babel、postcss

创建项目文件、目录架构

通过koa实现本地数据接口模拟

创建发布环境下的webpack配置文件

创建测试环境下的webpack配置文件、以及测试用例 (TODO)

自动初始化构建项目(TODO)

这七篇来分别介绍。

开发

一、初始化项目

创建项目文件夹

我们就叫vue-construct吧

初始化git

git init

初始化npm

npm init

创建项目文件

为了能让webpack跑起来,而不是一口气只讲配置而不运行一下,那样未免有些空洞,所以我们先创建一点项目文件和目录。

在这之前我们先安装两个包:vue、vue-router, npm i -S vue vue-router。

我们将项目代码相关文件都放在名为app的文件夹下。我先都创建完,然后一个个介绍。

├── app

│   ├── app.vue

│   ├── common

│   │   ├── img

│   │   ├── js

│   │   └── scss

│   ├── index.html

│   ├── index.js

│   ├── router

│   │   └── index.js

│   └── views

│   └── home

│   └── index.vue

├── .gitignore

├── package-lock.json

├── package.json

└── webpack.config.js

node_modules的话就忽略了。

文件/文件夹

用途

app.vue

作为vue的主文件

common

里面放公共的代码

index.html

页面模板文件

index.js

项目主入口文件

router

放vue对应的router文件

views

放视图文件

.gitignore

忽略node_module

咱们暂且不关系这些文件里的具体代码是什么,等webpack配置完再说。

二、配置webpack.config.js

安装一系列的包:

为了webpack的运行,需要安装

webpack

webpack-dev-server

为了处理vue单页文件,安装:

vue-loader

为了处理scss文件并从js中抽离,安装:

node-sass

style-loader

css-loader

sass-loader

vue-style-loader

postcss

postcss-loader

autoprefixer

extract-text-webpack-plugin

为了处理图片和字体文件,安装:

file-loader

url-loader

为了支持高级语法-babel,安装:

babel

babel-loader

babel-plugin-syntax-dynamic-import

babel-plugin-transform-object-rest-spread

babel-polyfill

babel-preset-env

为了验证代码格式-eslint,安装:

eslint

eslint-loader

eslint-plugin-html

babel-eslint

配置webpack.config.js文件

const webpack = require('webpack')

const path = require('path')

const HtmlWebpackPlugin = require('html-webpack-plugin')

const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')

// 为了抽离出两份CSS,创建两份ExtractTextPlugin

// base作为基础的css,基本不变,所以,可以抽离出来充分利用浏览器缓存

// app作为迭代的css,会经常改变

const isProduction = process.env.NODE_ENV === 'production'

const ExtractTextPlugin = require('extract-text-webpack-plugin')

const extractBaseCSS =

new ExtractTextPlugin(

{

filename:'static/css/base.[chunkhash:8].css',

allChunks: true,

disable: !isProduction // 开发环境下不抽离css

}

)

const extractAppCSS

= new ExtractTextPlugin(

{

filename:'static/css/app.[chunkhash:8].css',

allChunks: true,

disable: !isProduction // 开发环境下不抽离css

}

)

// 减少路径书写

function resolve(dir) {

return path.join(__dirname, dir)

}

// 网站图标配置

const favicon = resolve('favicon.ico')

// __dirname: 总是返回被执行的 js 所在文件夹的绝对路径

// __filename: 总是返回被执行的 js 的绝对路径

// process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径

const config = {

// sourcemap 模式

devtool: 'cheap-module-eval-source-map',

// 入口

entry: {

app: [

'babel-polyfill', // 这里是配合babel-present-env导入的动态babel-polyfill,因此npm需dev依赖

resolve('app/index.js')

]

},

// 输出

output: {

path: resolve('dev'),

filename: 'index.bundle.js'

},

resolve: {

// 扩展名,比如import 'app.vue',扩展后只需要写成import 'app'就可以了

extensions: ['.js', '.vue', '.scss', '.css'],

// 取路径别名,方便在业务代码中import

alias: {

api: resolve('app/api/'),

common: resolve('app/common/'),

views: resolve('app/views/'),

components: resolve('app/components/'),

componentsBase: resolve('app/componentsBase/'),

directives: resolve('app/directives/'),

filters: resolve('app/filters/'),

mixins: resolve('app/mixins/')

}

},

// loaders处理

module: {

rules: [

{

test: /\.js$/,

include: [resolve('app')],

loader: [

'babel-loader',

'eslint-loader'

]

},

{

test: /\.vue$/,

exclude: /node_modules/,

loader: 'vue-loader',

options: {

extractCSS: true,

loaders: {

scss: extractAppCSS.extract({

fallback: 'vue-style-loader',

use: [

{

loader: 'css-loader',

options: {

sourceMap: true

}

},

{

loader: 'postcss-loader',

options: {

sourceMap: true

}

},

{

loader: 'sass-loader',

options: {

sourceMap: true

}

}

]

})

}

}

},

{

test: /\.(css|scss)$/,

use: extractBaseCSS.extract({

fallback: 'style-loader',

use: [

{

loader: 'css-loader',

options: {

sourceMap: true

}

},

{

loader: 'postcss-loader',

options: {

sourceMap: true

}

},

{

loader: 'sass-loader',

options: {

sourceMap: true

}

}

]

})

},

{

test: /\.(png|jpe?g|gif|svg|ico)(\?.*)?$/,

loader: 'url-loader',

options: {

limit: 8192,

name: isProduction

? 'static/img/[name].[hash:8].[ext]'

: 'static/img/[name].[ext]'

}

},

{

test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,

loader: 'url-loader',

options: {

limit: 8192,

name: isProduction

? 'static/font/[name].[hash:8].[ext]'

: 'static/font/[name].[ext]'

}

}

]

},

plugins: [

// html 模板插件

new HtmlWebpackPlugin({

favicon,

filename: 'index.html',

template: resolve('app/index.html')

}),

// 抽离出css

extractBaseCSS,

extractAppCSS,

// 热替换插件

new webpack.HotModuleReplacementPlugin(),

// 更友好地输出错误信息

new FriendlyErrorsPlugin()

],

devServer: {

proxy: {

// 凡是 `/api` 开头的 http 请求,都会被代理到 localhost:7777 上,由 koa 提供 mock 数据。

// koa 代码在 ./mock 目录中,启动命令为 npm run mock。

'/api': {

target: 'http://localhost:7777', // 如果说联调了,将地址换成后端环境的地址就哦了

secure: false

}

},

host: '0.0.0.0',

port: '9999',

disableHostCheck: true, // 为了手机可以访问

contentBase: resolve('dev'), // 本地服务器所加载的页面所在的目录

// historyApiFallback: true, // 为了SPA应用服务

inline: true, //实时刷新

hot: true // 使用热加载插件 HotModuleReplacementPlugin

}

}

module.exports = {

config: config,

extractBaseCSS: extractBaseCSS,

extractAppCSS: extractAppCSS

}

总结

这一篇主要就做了三件事:

创建简单的项目结构

安装了这篇,以及之后要用到npm包

配置开发环境的Webpack

下一篇我们将配置eslint、babel、postcss - 从零开始做Vue前端架构(2)

项目完整代码

vue族谱架构_从零开始做Vue前端架构(1)相关推荐

  1. 从零开始做Vue前端架构(5)

    前言 弄完了前后端分离,我们自然想打包发布项目了. 不多说,就让我们来看看吧. 开发 直接上代码: const webpack = require('webpack') const path = re ...

  2. vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条号.百家号等 ...

  3. 【Puzzle】基于 Vue 和 Webpack4 的可插拔式微前端架构

    基于 Vue 和 Webpack4 的可插拔式微前端架构 - Puzzle 演示环境:PuzzleDemo 什么是 Puzzle Puzzle 是基于 Vue 和 Webpack4 实现的一种项目结构 ...

  4. 【Vue 快速入门】从零开始搭建 VUE + Element UI后台管理系统框架

    [Vue 快速入门]从零开始搭建 VUE + Element UI后台管理系统框架 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条 ...

  5. layui框架和vue哪个好_小颖的前端框架

    前端已经不再像以前一样就是简单的写写页面和调调样式而已,现在的前端越来越复杂,知识点越来越丰富. 要做WEB前端,就需要知道前端到底是什么,需要学习那些知识:前端至少要懂的三个部分:HTML,CSS, ...

  6. vue 回车查询 按钮_从零开始学习vue

    在github搜小程序我们可以看到许多用许多用vue开发的实例. 到底什么是vue,我们不妨浪费一天时间来了解一下. 一.什么是vue Vue是一个JavaScript框架.作者是国内常年混迹知乎的一 ...

  7. react在线文件_在线教育大前端架构演进之路

    前段时间,本人有幸于在深圳GMTC大前端架构演进专场进行分享.其后应叶冉编辑邀请,总结了此次分享的演讲稿<腾讯在线教育大前端架构演进之路>.首先做一下自我介绍.我是来自腾讯的工程师 hai ...

  8. vue 全局排序_搞定VUE [ 一 ]

    击上方  蓝字  关注我 首先.以我个人的观点,不赞成把这些东西死记下来,会使用,能上手做,有不明白的及时的去浏览.翻阅,在实战中去快速的理解和掌握,之后水到渠成式的一步步去走向深入.当然,从自身的职 ...

  9. vue 生命周期_深入理解Vue实例生命周期

    ‍vue实例生命周期与生命周期钩子‍ 每个 Vue 实 例在被创建时都会经过一系列的初始化过程.例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. 为了让开发者在 ...

最新文章

  1. linux下挂载移动硬盘
  2. cf 559a **
  3. 小教活动总结-VB即时通讯小程序
  4. 【问题记录】进行mybatis实例查询测试时Error opening session. Cause: java.lang.NullPointerException
  5. Go 指针 unsafe.Pointer
  6. map multimapc++_黑马C++视频笔记《STL之map/multimap》
  7. Etl之HiveSql调优(left join where的位置)
  8. SQL必知必会-创建表和操纵表
  9. 苹果或于2020年开售iPhone SE2
  10. Web前端工作笔记002---json数据查询的方法_json查询大全,JsonSQL数据查询,jfunk数据查询
  11. 解决Linux下redis客户端工具连接不到redis服务
  12. w ndows7光盘安装,想装啥版装啥版:Windows7安装光盘版本转换软件
  13. 自己动手写邮件群发助手
  14. 关于功能结构图 信息结构图 产品结构图那点小事
  15. OpenMP与MPI
  16. 28岁了,学习Java还好就业吗?
  17. 转:彼得·德鲁克:如何发挥人的长处?
  18. PHP 自动生成sitemap
  19. css 谷歌字体加载,使用谷歌网页字体无限制的添加字体到您的网站
  20. 【已解决】App unavailable Unfortunately, Claude is only available in certain countries and regions

热门文章

  1. python删除数组元素_python删除元素
  2. 顺丰丰桥下订单、订单查询、路由回调代码总结直接使用
  3. 四川智汇蓝图科技公司是怎样把网站口碑推广做好的
  4. 数字孪生中汽车发动机装配管理方案
  5. 教授专栏07| 张黔:智能感知技术助力智慧医疗
  6. 音频转文字软件哪个好?建议收藏这些软件
  7. 下一代太阳自适应光学技术让太空“天气预报”更精准
  8. Windows专业版安装jenkins的msi文件时,提示没有足够的系统服务安装权限,安装失败怎么办?
  9. bzoj5248 [2018多省省队联测]一双木棋
  10. mysql离散查询_mySQL数据库数据查询操作详解