在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:xxx-fe/mall-app开源软件地址:https://github.com/xxx-fe/mall-app开源编程语言:JavaScript 65.9%开源软件介绍:mall-app
支持多语言路由,多页应用,Mock,babel7,动态按需加载.适合pc,h5开发. 3步建立应用页面1.新建应用路由
const page = require('../controller/index');
module.exports = [
{path: '', ctrl: page.home},
{path: 'main', ctrl: page.home},
{path: 'api/list', ctrl: page.list, method: 'post'}
]; 2.新建应用控制器
const api = require('../api/index');
class page {
async home(ctx, _next) {
let locals = {
appId: 'home',
title: 'home-page'
};
//按需加载下必填,否则可忽略.
ctx.state.appKey = 'home/index';
//中台获取数据
let data = await api.getList(ctx);
ctx.state.list = data;
//使用common通用视图
await ctx.render('pages/common', locals);
}
async list(ctx, _next) {
let locals = {
list: await api.getList(ctx)
};
ctx.body = locals;
}
}
module.exports = new page(); 3.新建应用页面
...
<script>
export default {
appId: 'home', //必填,入口根据此ID渲染
data () {
return {
list: ''
}
},
mounted(){
this.$http.post('/api/list').then(response => {
console.log(response);
this.list = response.data.list
}, response => {
console.log(response);
})
}
}
</script>
... 架构前端
如果是移动端,请替换UI框架,比如vant. 中台
目录结构
安装npm install # npm 安装 命令npm run dev # 启动开发模式(dev)
npm run build # 构建项目
npm run prod # 启动生产模式(prod) 入口配置
任何模式都有效,通用入口配置. 处在不同位置.在开发,生产模式webapck构建时自动合并引入webpack.entry.(不做其他属性合并).一般情况不作其他属性修改. module.exports ={
header: './web/entry/header.js', //全局头部通用文件(引用vue,全局样式...)
// footer: './web/entry/footer.js', //全局底部通用文件(比如统计数据...)
};
开发模式有效,app入口配置.构建会合并所有属性. 所有的app入口都在 module.exports ={
entry: {
'app': './web/pages/app/index.js',
'app2': './web/pages/app2/index.js',
},
//devtool: '#cheap-module-eval-source-map'
...
}; 合并后的实际入口 entry: {
'app': [
'./web/entry/header.js',
'./web/entry/footer.js' ,
'./web/pages/app/index.js' ,
'webpack-hot-client/client'
],
'app2': [
'./web/entry/header.js',
'./web/entry/footer.js' ,
'./web/pages/app/index.js' ,
'webpack-hot-client/client'
]
}
生产模式有效,其他配置.构建会合并所有属性. module.exports ={
...
new ManifestPlugin({
publicPath: '/dist/'
})
...
}; 合并后的实际入口 entry: {
'app': ['./web/pages/app/index.js'],
'app2': ['./web/pages/app2/index.js'],
header: ['./web/entry/header.js'],
footer: ['./web/entry/footer.js']
}
脚手架默认按需加载,能满足大多数app开发,app这个入口一般一个即可. 项目只保留1个app,多app需另建. 视图引用handlebars-layouts(模板引擎布局helpers)
通用视图
parseUrl解析url,handlebars自定义helpers.根据当前开发环境返回正确的url. dev
{{{parseUrl 'app.css' 'app.js'}}} ↓↓↓ <script web="app.js"></script>
↓↓↓ <link href="/dist/static/css/app.[chunkhash].css" type="text/css" rel="stylesheet">
<script web="app.js"></script> prod <link href="/dist/static/css/app.[chunkhash].css" type="text/css" rel="stylesheet">
<script web="/dist/static/js/app.[chunkhash].js"></script> 有这种场景 如果存在多个app如app1,app2.在控制器就需要设置ctx.state.appName ='app的名字'.否则读取样式会不正确. 默认按需加载.ctx.appKey填上相关vue的路径即可. APPSTATE浏览器端, 整个app的传递信息(ctx.state封装),部分由
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{title}}</title>
{{{mountState}}}
{{{parseUrl 'header.css' 'header.js' }}}
{{#block "head"}}
{{/block}}
</head>
<body>
{{#block "body"}}{{/block}}
</body>
</html> {{{mountState}}} //将ctx.state挂载到window.APPSTATE ↓↓↓ <script type="text/javascript">
window.APPSTATE = {
locale:'zh',
publicServer:'',
appName:'app'
}
</script> 查看页面源代码一般会看到以上代码. mock动态引用
...
# 是否使用模拟数据api(dev模式有效)
isMockAPI : true
# apiServer api服务器
apiServer : 'http://localhost:3334'
...
{{{parseUrl 'header.css' 'header.js'}}} ↓↓↓ <script src="/public/vendor/mockjs/dist/mock-min.js"></script> 1.服务端Mock1.1 编写/server/mock/**/.json文件.
现在请求
服务端返回
服务端返回 2.前端Mock2.1 编写/web/mock/**/index.js文件.
Mock.mock('/api/list', 'post', function () {
return Mock.mock({
"list|5-10": [{
'name': '@cname',
'imageUrl': 'http://placehold.it/300x150/f69/fff',
'description': '@cname'
}]
});
}); 优先级:前端Mock文件>后端Mock文件.否则报500. 打包
...
#webpack构建路径(prod模式有效)
buildPath:
# name entry路径
# isIndexEntry 是否使用index.js作为webpack.entry.
# isIndexEntry = true
# './web/pages/app/index.js' --> /dist/static/js/app[chunkhash].js
# 使用index.js上一级目录名作为打包文件名(example.js).
# isIndexEntry = false
# './web/locale/zh.js' --> /dist/static/js/zh[chunkhash].js
# 使用当前文件作为打包文件名(zh.js).
-
name: './web/pages'
isIndexEntry : 'true'
-
name: './web/locale'
... 一般情况每一个应用都建立在 否则,如果有 所以, dev 从这些配置文件打包 prod 从这些配置文件打包 多语言1.配置参数
...
# 多语言路由前缀
locales: ['zh', 'en'[,.]]
# webpack构建路径(entry)
buildPath:
-
#多语言入口
name: './web/locale'
... 缺一不可 2.创建多语言文件
window.locale = {
'desc': 'vue koa 多页应用脚手架'
};
window.locale = {
'desc': 'vue koa scaffold'
}; 多语言文件会在 3.创建全局方法
/**
* 获取locale对应的值
*/
window.getLocale = function (key) {
if (window.locale) {
return window.locale[key] || '';
}
else {
return key;
}
}; 4.调用全局方法...
data() {
return {
list: '',
desc: getLocale('desc')
}
}
... 路由则支持 动态加载文件以下路径的文件根据原本代码逻辑,自动引用所有js,无需手动引入.
例如
//动态加载 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论