uni-app全端小程序起步 - 搭建项目与命令行新增页面与组件

官网任意门

关于uni-app小程序之前做过一点入门,这次又重新接触,从无到有的一个过程,包括构建框架,新增页面,新增组件等等。我们一点一点进行总结。

搭建项目(引入基础插件)

这个步骤在之前我入门的时候写过一篇文章,可直接翻阅。

uni-app使用命令行搭建框架并引入uni-simple-router及uni-request

其中关于引入uni-simple-router报错的问题,在此次项目实践中也未复现,重新写一下引入步骤。

首先列出官网地址

注:在使用了uni-simple-router插件的同时也使用了 uni-read-pages 来读取路由

  1. 使用npm引入插件
npm install uni-simple-router
  1. 在vue.config.js 中引入uni-read-pages
const TransformPages = require('uni-read-pages')
const {
    
    
  webpack
} = new TransformPages()

module.exports = {
    
    
    plugins: [
        new webpack.DefinePlugin({
    
    
            ROUTES: webpack.DefinePlugin.runtimeValue(() => {
    
    
                const tfPages = new TransformPages({
    
    
                    includes: ['path', 'name', 'aliasPath', 'meta'] // 记得加入meta来判断是否需要登录,与 vue-router 相同
                })
                return JSON.stringify(tfPages.routes)
            }, true)
        })
    ]
  }
}
  1. page.json中的实例
{
    
    
	"path": "pages/main/main",
	"style": {
    
    
	     "navigationBarTitleText": "登录模板"
	 },
	 "name": "main",
     "meta": {
    
     "requiredAuth": true }
}
  1. 新增文件
// router.js
import {
    
    
  RouterMount,
  createRouter
} from 'uni-simple-router';


console.log(ROUTES)
const router = createRouter({
    
    
  platform: process.env.VUE_APP_PLATFORM,
  routes: [...ROUTES]
});
//全局路由前置守卫
router.beforeEach((to, from, next) => {
    
    
  console.log('---全局路由前置守卫---')
  console.log(to)
  console.log(from)
  console.log('---------------------')
//   if (to.meta.requiredAuth) {
    
    
//     // 需要登录跳转
//     console.log('需要登录')
//     next('/pages/login/login')
//   } else {
    
    
//     next();
//   }
});
// 全局路由后置守卫
router.afterEach((to, from) => {
    
    
  console.log('跳转结束')
})

export {
    
    
  router,
  RouterMount
}
  1. 在main.js 中引入
import {
    
    router,RouterMount} from './utils/router.js';
Vue.use(router)
....
//v1.3.5起 H5端 你应该去除原有的app.$mount();使用路由自带的渲染方式
// #ifdef H5
RouterMount(app, router, '#app')
// #endif

// #ifndef H5
app.$mount(); //为了兼容小程序及app端必须这样写才有效果
// #endif
  1. 各文件目录(项目文件,不便显示)

在这里插入图片描述

微信小程序示例图:
在这里插入图片描述

H5示例图:
在这里插入图片描述

注:以上代码都为关键代码,非全部代码!

新增页面

uni-app推荐使用的开发工具为 Hbuilder,但是我们前端大部分使用的都是 vscode

我们尝试使用命令行新增页面与组件

使用的是 plop

  1. 新增 plopfile.js

文件位置,可查找上一部分文件目录截图

const viewGenerator = require('./plop-templates/page/prompt')
const componentGenerator = require('./plop-templates/component/prompt')

module.exports = function(plop) {
    
    
  plop.setGenerator('page', viewGenerator)
  plop.setGenerator('component', componentGenerator)
}
  1. 新增 命令行生成页面与组件的 模版

在这里插入图片描述
我们这里以page为例,只描述重点步骤

utils.js - name 不能为空,并且有一个生成一秒的延迟

exports.notEmpty = name => {
    
    
  return v => {
    
    
    if (!v || v.trim === '') {
    
    
      return `${
      
      name} is required`
    } else {
    
    
      return true
    }
  }
}
exports.delayLog = msg => answers => new Promise((resolve) => {
    
    
		setTimeout(() => resolve(msg), 1000);
	});

/page/index.hbs - 描述的为页面的模版

{
    
    {
    
    #if template}}
<template>
    <view class="{
    
    {name}}">

    </view>
</template>
{
    
    {
    
    /if}}

{
    
    {
    
    #if script}}
<script>
    export default {
    
    
        data() {
    
    
            return {
    
    
                test: true
            }
        },
        methods: {
    
    

        }
    }
</script>
{
    
    {
    
    /if}}

{
    
    {
    
    #if style}}
<style lang="scss" scoped>

</style>
{
    
    {
    
    /if}}

/page/prompt.js - 描述的为页面的配置及默认设置

const {
    
     notEmpty, delayLog } = require('../utils.js')

module.exports = {
    
    
  description: '创建一个页面',
  prompts: [{
    
    
    type: 'input',
    name: 'name',
    message: '请输入页面名称:',
    validate: notEmpty('name')
  },
  {
    
    
    type: 'input',
    name: 'titletext',
    message: '请输入页面Title',
    validate: notEmpty('titletext')
  },
  {
    
    
    type: 'checkbox',
    name: 'blocks',
    message: '包含的模块:',
    choices: [{
    
    
      name: '<template>',
      value: 'template',
      checked: true
    },
    {
    
    
      name: '<script>',
      value: 'script',
      checked: true
    },
    {
    
    
      name: '<style>',
      value: 'style',
      checked: true
    }
    ],
    validate(value) {
    
    
      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
    
    
        return 'View require at least a <script> or <template> tag.'
      }
      return true
    }
  }
  ],
  actions: data => {
    
    
    const name = '{
    
    {name}}'
    const actions = [
      delayLog('正在创建页面~~~'),
      {
    
    
        type: 'add',
        path: `src/pages/${
      
      name}/${
      
      name}.vue`,
        templateFile: 'plop-templates/page/index.hbs',
        data: {
    
    
          name: name,
          template: data.blocks.includes('template'),
          script: data.blocks.includes('script'),
          style: data.blocks.includes('style')
        }
      },
      delayLog('页面创建成功,添加路由!'),
      {
    
    
        type: 'modify',
        path: `src/pages.json`,
        pattern: /(\/\/generator router)/gi,
        templateFile: 'plop-templates/page/route.hbs',
      }
    ]
    return actions
  }
}

/pages/route.hbs - 描述的是向pages.json中添加新增页面的路由

    ,{
    
    
      "path": "pages/{
    
    {name}}/{
    
    {name}}",
      "style": {
    
    
        "navigationBarTitleText": "{
    
    {titletext}}"
      }
    }
$1

一定要在pages.json 中增加一行“注释”,这一行是自动添加路由的位置,如果删除,那么页面路由就添加不上了
在这里插入图片描述

  1. 在脚本文件中增加命令

添加在scripts 中

"new": "plop"

在这里插入图片描述

  1. 使用方法
npm run new

在这里插入图片描述

新增组件这里不在赘述,详细描述可参见官网

猜你喜欢

转载自blog.csdn.net/lb1135909273/article/details/113841859