.Net Core+Vue.js+ElementUI 实现前后端分离

Tags: Vue


架构

前端采用:Vue.js、Element-UI、axios

后端采用:.Net Core Mvc

本项目是基于Vue.js的多页应用,由于是后端开发对不擅长Node.js开发并且希望使用传统的方式进行权限管控及生产发布,所以.Net Core Mvc 承担了所有的页面路由管控及页面级权限控制,Vue.js只是作为视图渲染及页面交互使用。

准备工作

Node安装及配置

node -v
  • 配置淘宝npm镜像
 # 临时使用
npm --registry https://registry.npm.taobao.org install express # 永久使用
npm config set registry https://registry.npm.taobao.org # 配置后可通过下面方式来验证是否成功
npm config get registry

客户端实现


搭建vue脚手架

  • 使用npm全局安装vue-cli脚手架构建工具

    vue-cli 提供一个官方命令行工具,可用于快速搭建大型单页应用。该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程。只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目:
npm install -g vue-cli
  • 创建一个基于 webpack 模板的新项目
# vue-multiple为自定义名称,注意项目名称不能大写
vue init webpack vue-multiple # 初始化配置中 Install vue-router? 选择 no, 不使用vue-router,其他配置项默认即可

执行初始化命令后需要输入以下内容:

 1. Project name (my-project) # 项目名称(我的项目)
2. Project description (A Vue.js project) # 项目描述一个Vue.js 项目
3. Author 作者(你的名字)
4. Install vue-router? (Y/n)# 是否安装Vue路由,也就是以后是spa(但页面应用需要的模块)
5. Use ESLint to lint your code? (Y/n) # 使用 ESLint 到你的代码? (Y [ yes ] / N [ no ])
6. Pick an ESLint preset (Use arrow keys) # 选择一个预置ESLint(使用箭头键) Setup unit tests with
7. Karma + Mocha? (Y/n) # 设置单元测Karma + Mocha? (Y/ N) Setup e2e tests
8. with Nightwatch? (Y/n) # 设置端到端测试,Nightwatch? (Y/ N)
  • 安装项目所需要的依赖
cd vue-multiple

# 本地安装npm依赖包,保存至 ./node_modules目录

npm install

chromedriver@2.38.3 install: node install.js 报错解决办法:

 1.全局安装 chromedriver
npm install chromedriver -g 2.指定淘宝镜像安装
npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
  • 运行项目
#运行dev命令 启动server服务器,并监听8080端口,开发环境测试使用

npm run dev 

#看到  I  Your application is running here: http://localhost:8080 并且能够成功访问  http://localhost:8080   表示项目创建成功 


修改项目模板目录

build/                       #webpack打包配置
build.js #构建生产代码
check-versions.js #检测node及npm版本
vue-loader.conf.js #处理Vue文件中的样式 vue开发环境的wepack相关配置文件,主要用来处理各种文件的配置
utils.js #额外的通用方法
webpack.base.conf.js #默认的webpack配置
webpack.dev.conf.js #本地开发的webpack配置
webpack.prod.conf.js #构建生产的webpack配置
config/ 配置文件
dev.env.js
index.js #定义开发环境和生产环境中所需要的参数
pord.env.js
test.env.js
src/
assets/ #放资源
components/ #公共组件
views/ #页面模块
home/ #子页面
index.html #模版页面
index.js #js入口
// 注意,这里的html和js的文件名要一致,如上面就是index
dist/ #最后打包生成的资源

修改webpack打包配置以支持多页应用开发 webpack中文

  • 修改build/utils.js文件,添加以下代码:
const glob = require('glob')
// 页面模板
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 取得相应的页面路径,因为之前的配置,所以是src文件夹下的views文件夹
const PAGE_PATH = path.resolve(__dirname, '../src/views')
// 用于做相应的merge处理
const merge = require('webpack-merge') // 多页面入口配置,通过glob模块读取views文件夹下所有对应文件夹下的js后缀文件,作为入口文件处理
exports.entries = function () {
var entryFiles = glob.sync(PAGE_PATH + '/*/*.js')
var entries = {},
basename,
tmp,
pathname;
entryFiles.forEach((entry) => {
basename = path.basename(entry, path.extname(entry));
tmp = entry.split("/").splice(-3);
pathname = tmp.splice(1, 1) + "/" + basename; // 正确输出js和html的路径
entries[pathname] = entry;
})
return entries
}
// 多页面输出配置,与上面的多页面入口配置相同,读取views文件夹下的对应的html后缀文件,然后放入数组中
exports.htmlPlugin = function () {
let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
let htmlentries = []
let basename,
tmp;
entryHtml.forEach((filePath) => {
basename = path.basename(filePath, path.extname(filePath));
tmp = filePath.split("/").splice(-3);
let filename = tmp.splice(1, 1) + "/" + basename; // 正确输出js和html的路径
let conf = {
// 模板来源
template: filePath,
// 文件名称
filename: filename + '.html',
// 页面模板需要加对应的js脚本,如果不加这行则每个页面都会引入所有的js脚本
chunks: ['manifest', 'vendor', filename],
inject: true
}
if (process.env.NODE_ENV === 'product') {
conf = merge(conf, {
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
},
chunksSortMode: 'dependency'
})
}
htmlentries.push(new HtmlWebpackPlugin(conf))
})
return htmlentries
}
  • 修改webpack.base.conf.js:配置多个页面的js入口
module.exports = {
entry: utils.entries(), //设置多个页面的js入口
...
}
  • 修改webpack.dev.conf.js:本地开发的多页面配置
plugins: [
...
// 注释HtmlWebpackPlugin相关配置
// new HtmlWebpackPlugin({
// filename: 'index.html',
// template: 'index.html',
// inject: true
// }),
...
].concat(utils.htmlPlugin()) //添加Html模板集合
  • 修改webpack.prod.conf.js:构建生产的多页面配置
 plugins: [
...
// 注释HtmlWebpackPlugin相关配置
// new HtmlWebpackPlugin({
// filename: process.env.NODE_ENV === 'testing' ?
// 'index.html' :
// config.build.index,
// template: 'index.html',
// inject: true,
// minify: {
// removeComments: true,
// collapseWhitespace: true,
// removeAttributeQuotes: true
// // more options:
// // https://github.com/kangax/html-minifier#options-quick-reference
// },
// // necessary to consistently work with multiple chunks via CommonsChunkPlugin
// chunksSortMode: 'dependency'
// }),
...
].concat(utils.htmlPlugin()) //添加Html模板集合

如何去除js、css文件名hash值

    // 删除filename中的contenthash配置去除css文件名hash
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].css'),
allChunks: true,
}) // 删除filename和chunkFilename中的chunkhash配置去除js文件名hash
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
}
  • 执行npm run build 指令测试打包是否成功
打包成功生成以下目录及文件
dist\
home\
index.html
static
css
home
index.css
js
home index.js
manifest.js
vender.js

github地址:https://github.com/chubin518/vue-multiple.git

服务端实现

  • 打开VS创建Web应用,项目创建成功后删除不必要的js、css引用等。
  • 将生成的dist目录拷贝纸wwwroot文件加下
  • _layout.cshtml 模板页添加 vender.js 、 manifest.js 引用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - NetCoreVueMultiple</title>
<link href="~/dist/static/css/main/index.css" rel="stylesheet" />
@RenderSection("Styles", required: false)
</head>
<body>
@RenderBody()
<script src="~/dist/static/js/manifest.js"></script>
<script src="~/dist/static/js/vendor.js"></script>
<script src="~/dist/static/js/main/index.js"></script>
@RenderSection("Scripts", required: false)
</body>
</html>

element-ui的引入方式参考官网

本实例使用webpack一起打包进了vendor.js中

  • 修改Index.cshtml 如下:
@{
ViewData["Title"] = "Home Page";
}
@section Styles{
<link href="~/dist/static/css/home/Index.css" rel="stylesheet" />
}
<div id="app">
</div>
@section Scripts{
<script src="~/dist/static/js/home/Index.js"></script>
}
  • 编译项目运行

github地址:https://github.com/chubin518/NetCoreVueMultiple.git

  • 也可将前后端项目合并,将vue项目相关文件复制到MVC项目根目录,修改config/index.js
  build: {
// 输出打包后的文件至wwwroot下的dist文件夹,执行npm run build 会自动生成js至wwwroot/dist下
assetsRoot: path.resolve(__dirname, '../wwwroot/dist'),
}
  • 如果项目中已经已经以script的方式引入vue.js /element-ui 等框架时,再次引用manifest.js,vendor.js文件可能会引起js框架版本冲突等问题

此时可通过配置设置不打包公共组件,具体操作如下:

  • 修改webpack.base.conf.js,不打包的文件
let exten = {};
if (process.env.NODE_ENV === 'testing') {
// key 为应用的第三方库的名称,value为在项目中起的别名
exten = { //不打包的文件
jquery: 'jQuery',
'element-ui': 'ElementUI',
vue: "Vue",
vuex: 'Vuex',
axios: 'axios',
moment: 'moment'
}
}
module.exports = {
entry: utils.entries(), //设置多个页面的js入口
externals: exten,
...
}
  • 复制 webpack.prod.conf.js 并重命名为 webpack.test.conf.js,修改webpack.test.conf.js配置
    // 注释 CommonsChunkPlugin 不生成manifest.js,vendor.js文件

    // new webpack.optimize.CommonsChunkPlugin({
// name: 'vendor',
// minChunks(module) {
// // any required modules inside node_modules are extracted to vendor
// return (
// module.resource &&
// /\.js$/.test(module.resource) &&
// module.resource.indexOf(
// path.join(__dirname, '../node_modules')
// ) === 0
// )
// }
// }), // new webpack.optimize.CommonsChunkPlugin({
// name: 'manifest',
// minChunks: Infinity
// }), // new webpack.optimize.CommonsChunkPlugin({
// name: 'app',
// async: 'vendor-async',
// children: true,
// minChunks: 3
// }),
  • 复制 build.js 并重命名为 build.test.js,修改build.test.js配置
// 设置环境变量为testing
process.env.NODE_ENV = 'testing'
// 加载webpack.test.conf.js配置
const webpackConfig = require('./webpack.test.conf.js')
// 设置静态输出目录为test
config.build.assetsSubDirectory = "test"
  • 修改 build/utils.js 修改静态文件输出目录为test
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
config.build.assetsSubDirectory :
process.env.NODE_ENV === 'testing' ?
"test" : config.dev.assetsSubDirectory return path.posix.join(assetsSubDirectory, _path)
}
  • 修改package.json 添加test环境编译指令
  "scripts": {
....
"build": "node build/build.js",
"build:test": "node build/build.test.js"
},
  • 编译打包测试配置修改是否OK

.Net Core+Vue.js+ElementUI 实现前后端分离的更多相关文章

  1. vue.js+UEditor集成 [前后端分离项目]

    首先,谈下这篇文章中的前后端所涉及到的技术框架内容. 虽然是后端的管理项目,但整体项目,是采用前后端分离的方式完成,这样做的目的也是产品化的需求: 前端,vue+vuex+vue router+web ...

  2. 悟空CRM(基于jfinal+vue+ElementUI的前后端分离的开源CRM系统)

    https://www.jfinal.com/share/1591 官网:http://www.5kcrm.com 官网:http://www.72crm.com 论坛:http://bbs.72cr ...

  3. SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程01---搭建前端工程

    豆宝社区项目实战教程简介 本项目实战教程配有免费视频教程,配套代码完全开源.手把手从零开始搭建一个目前应用最广泛的Springboot+Vue前后端分离多用户社区项目.本项目难度适中,为便于大家学习, ...

  4. 如何利用vue和php做前后端分离开发?

    新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...

  5. vue+uwsgi+nginx部署前后端分离项目

    前后端分离,vue前端提供静态页面,且可以向后台发起get,post等restful请求. django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 后端 创建虚拟环境 解决dj ...

  6. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  7. vue+egg.js+mysql一个前后端分离留言板项目

    一.前序 我相信每个人前端搬运工和我想法都是一样的,都有一个做全栈的梦,无奈面对众多的后台语言,却不从下手,今天由我来带你们潜入全栈的门槛,注意是门槛.能不能学的会后面的内容全靠坚持了. 我今天主要做 ...

  8. linux Vue+nginx+django 实现前后端分离

    示例项目 -- LuffyCity.com 的上线 具体解释,vue前端提供静态页面,且可以向后台发起get,post等restful请求 django后台提供数据支撑,返回json数据,返回给vue ...

  9. SpringBoot+Vue豆宝社区前后端分离项目手把手实战系列教程02---创建后端工程

    本节代码开源地址 代码地址 项目运行截图 搭建后端工程 0.导入sql 在数据库导入 /* Navicat Premium Data Transfer Source Server : localhos ...

随机推荐

  1. Java并发编程笔记之LongAdder和LongAccumulator源码探究

    一.LongAdder原理 LongAdder类是JDK1.8新增的一个原子性操作类.AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK ...

  2. CSS的定位问题总结

    CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多年来通常需要使用多个表格才能完成的任务. 定位的基本思想很简单,它允许 ...

  3. Ripple(瑞波币)validator-keys-tool 配置验证器

    目录 Ripple(瑞波币)validator-keys-tool配置验证器 验证器密钥工具指南 验证器密钥 验证器令牌(Validator Keys) public_key撤销 签名 Ripple( ...

  4. 微信小程序登录方案

    微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...

  5. [转]数据库中Schema(模式)概念的理解

    在学习数据库时,会遇到一个让人迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等. 如果把database看作是一个仓库,仓库很多 ...

  6. DOM-添加元素、节点

    createElement()方法能够根据参数指定的标签名称创建一个新元素,并返回新建元素的引用,用法如下 var element=document.createElement("tagNa ...

  7. SQL查询几种的区别。

    最近看了几篇SQL查询的文章做一下总结哦,大概简记如下: SQL查询的实质是,是指从数据库中取得数据的子集,可以先取列子集,然后再取符合条件的行子集. 1.单表查询: SELECT [Name] ,[ ...

  8. CentOS7安装后连不上网络无法使用yum

    更新日期:2018年5月31日 笔者今天在本地VMware中安装了CentOS7后,使用yum安装wget的时候发现不能下载,并有下图所示的提示: 于是,笔者就去问度娘,然后就找到了如下各种回复: 1 ...

  9. MVC登陆认证简单设置

    首先,弄个基类 /// <summary> /// 所有控制器基类,里面重写了OnActionExecuted方法 /// </summary> public class Ba ...

  10. 线程9--NSOperation

    一.NSOperation简介  1.简单说明  NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程  NSOperation和NSOpe ...