.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_try,catch,finally return之间的执行顺序

    以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.f ...

  2. 酷派大神F2使用QPST进行nv备份恢复,解决无信号问题

    测试机器: 大神F2联通版 8675_W00 系统COOLUI55     写贴原因: 自己无意间刷错了包,结果手机无信号,进入工程模式怎么设置都没有用.尝试过系统还原(备份过).刷新的ROM.线刷, ...

  3. ActiveMQ专题1: 入门实例

    序 好久没有写博客了,最近真的是可以说是忙成狗了.项目的事和自己的终身大事忙得焦头烂额,好在是一切都是越来越好了...... 趁着项目今天唯一的一点喘息时间,加上项目开始接触到的mq,开始写一篇amq ...

  4. .NET编译过程

    总结一下.NET的编译过程, 一般的高级编程语言会把代码编译成机器码,也就是我们说的非托管代码,执行在编译它的电脑上. 而.NET编译代码的时候会把高级编程语言编译成中间语言 运行在CLR(公共语言运 ...

  5. Netty面试

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话  1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要 ...

  6. Spring中的IOC示例

    Spring中的IOC示例 工程的大概内容是: 一个人在中国时用中国话问候大家,在国外时用英语问候大家. 其中, IHelloMessage是接口,用来定义输出问候信息 public interfac ...

  7. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  8. 《AlphaGo世纪对决》与周志华《机器学习》观后感

    这两天看了<AlphaGo世纪对决>纪录片与南大周志华老师的<机器学习>,想谈谈对人工智能的感想. 首先概述一下视频的内容吧,AlphaGo与李世石对战的过程大家都有基本的了解 ...

  9. Python爬虫初识

    本文章是对网易云课堂中的Python网络爬虫实战课程进行总结.感兴趣的朋友可以观看视频课程.课程地址 爬虫简介 一段自动抓取互联网信息的程序 非结构化数据 没有固定的数据格式,如网页资料. 必须通过E ...

  10. Tomcat启动慢原因之二 he APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

    Tomcat启动时提示: 信息: The APR based Apache Tomcat Native library which allows optimal performance in prod ...