用vue实现后台管理系统思路: 要在 浏览器上访问, 所以要依赖 本地服务器。启动本地服务器,然后查看页面。
如果要在其他文件下 写代码。 那就再其他文件使用webpack 打包到 本地服务器所在的文件夹。
例如: 文件夹名称
服务器文件夹 server
后台管理文件夹 admin
定义一个目录,
// 引入express
let express = require('express');
// 引入ejs
let ejs = require('ejs');
// 服务器模块
let http = require('http')
let https = require('https')
// 引入fs和path
let fs = require('fs');
let path = require('path');
// 创建应用
let app = express();
// 拓展名
app.engine('.html', ejs.__express);
// 实现资源静态化
// static请求静态化
app.use('/static/', express.static(path.join(process.cwd(), './static/')))
app.use('/favicon.ico', express.static(path.join(process.cwd(), './static/favicon.ico')))
// 路由,
app.get('/', (req, res) => {
res.render('home.html')
})
// 后台管理系统的路由
app.get('/admin', (req, res) => {
res.render('admin.html')
})
// mock数据
app.use('/data/', (req, res, next) => {
// 添加拓展名
// req.url += '.json';
// console.log(req.url)
// 1 切割url
let arr = req.url.split('?')
// 2 添加拓展名
arr[0] += '.json';
// 3 拼接地址
req.url = arr.join('?')
// 进入下一个中间件
next();
}, express.static(path.join(process.cwd(), './static/data/')))
// 服务器,
// 端口号
let httpPort = 3001;
let httpsPort = 3002;
// 读取秘钥文件
let key = fs.readFileSync(path.join(process.cwd(), './ssl/private.pem'));
let cert = fs.readFileSync(path.join(process.cwd(), './ssl/file.crt'));
// http
http.createServer(app)
.listen(httpPort, res => console.log('http port listen at ' + httpPort))
// https
https.createServer({ key, cert }, app)
.listen(httpsPort, res => console.log('https port listen at ' + httpsPort))
// 引入path
let path = require('path');
// 根路径
let root = process.cwd();
// vue插件
let { VueLoaderPlugin } = require('vue-loader');
// 引入模板插件
let HtmlWebpackPlugin = require('html-webpack-plugin');
// 引入拆分样式插件
let MiniCssExtractPlugin = require('mini-css-extract-plugin');
// 压缩样式
let OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')
// 接口
module.exports = {
// 模式
// mode: 'production',
mode: 'development',
// 解决问题
resolve: {
// 拓展名
extensions: ['.js', '.vue', '.es'],
// 别名
alias: {
// vue
vue$: 'vue/dist/vue.js',
'@': path.join(root, './src'),
'@c': path.join(root, './src/components'),
'@v': path.join(root, './src/views'),
'@t': path.join(root, './src/tools'),
}
},
// 入口
entry: './src/main.js',
// 发布
output: {
// 相对路径
path: path.join(root, '../server'),
// static/admin
filename: './static/admin/[name].js',
// 静态资源相对位置
publicPath: '/'
},
// 模块
module: {
// 加载机
rules: [
// es6
{
test: /\.js$/,
// loader: 'babel-loader',
// options: {
// presets: ['@babel/preset-env']
// }
// 处理的文件
include: path.join(root, './src/'),
// 不处理的文件
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
]
},
// vue
{
test: /\.vue$/,
use: [
{
loader: 'vue-loader',
// 配置
options: {
extractCSS: true
}
}
]
},
// css
{
test: /\.css$/,
use: [
'style-loader',
MiniCssExtractPlugin.loader,
'css-loader'
]
},
// scss
{
test: /\.scss$/,
use: [
'style-loader',
MiniCssExtractPlugin.loader,
'css-loader',
'sass-loader'
]
},
// 字体图标
{
test: /\.(ttf|woff)$/,
use: [
'url-loader'
]
}
]
},
// 插件
plugins: [
// html插件
new HtmlWebpackPlugin({
// 模板位置
template: './public/index.html',
// 发布位置
filename: './views/admin.html',
// 指纹
hash: true
}),
// vue
new VueLoaderPlugin(),
// 拆分样式
new MiniCssExtractPlugin({
filename: './static/admin/style.css'
}),
// 压缩css
new OptimizeCssAssetsPlugin()
],
// 优化
optimization: {
// 拆分库文件
splitChunks: {
// 缓存
cacheGroups: {
// 库文件发布到lib目录下
lib: {
name: 'lib',
test: /node_modules/,
chunks: 'initial'
}
}
}
}
}
未完