创建uni-app项目

创建uni-app项目

1.通过vue-cli命令行创建

1.1 使用正式版(对应HBuilderX最新正式版)
vue create -p dcloudio/uni-preset-vue my-project
1.2 使用alpha版(对应HBuilderX最新alpha版)

  alpha版相当于尝鲜版本,比最新正式版本多出许多功能。

vue create -p dcloudio/uni-preset-vue#alpha my-alpha-project
1.3 选择模板

  执行了上面命令之后,会提示选择项目模板,这里选择了默认模板
创建uni-app项目

1.4 运行、发布uni-app
npm run dev:%PLATFORM%
npm run build:%PLATFORM%

  %PLATFORM% 可取值如下:这里选取了常用的3种

平台
app-plus app平台生成打包资源(支持npm run build:app-plus,可用于持续集成。不支持run,运行调试仍需在HBuilderX中操作)
h5 H5
mp-weixin 微信小程序
1.4.1 以运行微信小程序为例:

  1) 输入命令:npm run dev:mp-weixin
创建uni-app项目
  2) 使用微信开发者工具,打开运行编译的代码 dist\dev\mp-weixin
创建uni-app项目
  3) 修改uni-app项目代码,微信开发者工具会同步更新
创建uni-app项目
创建uni-app项目

1.4.2 以发布H5项目为例:

  1) 输入命令:npm run build:h5
创建uni-app项目
  2) 将编译后的项目dist\build\h5,使用node.js http-serve服务运行验证:
  在想要启动服务的文件夹下,打开命令行,输入http-server:
创建uni-app项目
  在浏览器输入上面显示的ip可端口即可访问:
创建uni-app项目

1.5 uni-app项目目录分析

创建uni-app项目
  1).public 下面的 index.html 模板文件

    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>
            <%= htmlWebpackPlugin.options.title %>
        </title>
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
            })
            var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')
        </script>
        <link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
        <link rel="icon" href="./static/favicon.ico">
    </head>
 <div id="app"></div>

  BASE_URL:项目根路径。
  viewport-fit=cover 兼容iponex刘海。env()和constant(),是IOS11新增特性。
  VUE_APP_INDEX_CSS_HASH ,获取文件部分哈希值 查看源码:

  const buffer = fs.readFileSync(require.resolve('@dcloudio/uni-h5/dist/index.css'))
  process.env.VUE_APP_INDEX_CSS_HASH = loaderUtils.getHashDigest(buffer, 'md5', 'hex', 8)
Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
  ...App
})
app.$mount()

  1) Vue.config.productionTip = false 是提示开发环境信息
  2) App.mpType = ‘app’ 是为了与后面要讲的小程序页面组件所区分开来,当注释掉这段代码,会发现报错
创建uni-app项目


chunk-vendors.js:28888 [Vue warn]: Property or method "keepAliveInclude" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

(found in at App.vue)
warn @ chunk-vendors.js:28888
chunk-vendors.js:28888 [Vue warn]: Error in render: "TypeError: Cannot read properties of undefined (reading 'meta')"

  分析下报错原因,如Property or method “keepAliveInclude” is not defined ,查看下源码:src\core\service\plugins\index.js

   Vue.mixin({
      beforeCreate () {
        const options = this.$options
        if (options.mpType === 'app') {
          options.data = function () {
            return {
              keepAliveInclude
            }
          }
          const appMixin = createAppMixin(routes, entryRoute)
        .......
    })

  3) app.$mount() 如果没有提供 elementOrSelector 参数,模板将被渲染为文档之外的的元素,并且你必须使用原生 DOM API 把它插入文档中,查看源码src\core\service\plugins\app\index.js

 beforeMount: function appBeforeMount () {
      // TODO 平台代码
      this.$el = document.getElementById('app')
    }

  4) 初始化h5项目网页标题,修改模板文件,开发环境 server 配置
  第一种方法,通过vue.config.js,注意不是vue官方说的config.plugin(‘html’).tap

devServer: {
    host: '10.1.2.55',
    port: 8002, //端口号
    proxy: {
      '/api': {
        target: 'http://localhost:3000/', // 后端地址
        secure: false, // 如果是https接口,需要配置这个参数
        ws: true, // 是否代理websockets
        changeOrigin: true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  chainWebpack: config => {
    config
      .plugin('html-index')
      .tap(args => {
        args[0].title = '你想设置的title名字'
        //  修改模板文件
        args[0].template = './public/index2.html'
        return args
      })
  }

  第2种方法,通过manifest.json配置,注意vue-cli创建的uni-app项目manifest.json是在src文件夹下面的。uni-app官网manifest配置h5

"h5": {
      "title": "hello-title",
      "template":"../public/index2.html",
      "devServer": {
        "host": "10.1.2.55",
        "port" : 8000, // 端口号
        "disableHostCheck" : true,
        "proxy" : {
            "/api" : {
                "target" : "http://localhost:3000/", // 目标接口
                "ws": true, // 是否代理websockets
                "secure" : false, // 设置支持https协议的代理
                "changeOrigin" : true, //是否跨域
                "pathRewrite" : {
                    "^/api" : ""
                }

            }
        }
			}
    }

  vue.config.js 有许多配置在vue里面支持,但是在uni-app里面不支持 如:publicPath 不支持,如果需要配置,请在 manifest.json->h5->router->base 中配置,参考文档:h5-router;outputDir 不支持;assetsDir 固定 static。uni-app官网vue.config.js

2.通过HBuilderX可视化界面

2.1 创建uni-app

  在点击工具栏里的文件 -> 新建 -> 项目:
创建uni-app项目
  选择uni-app类型,输入工程名,选择模板,点击创建,即可成功创建

2.2 运行uni-app

  1)运行h5
创建uni-app项目

  2)运行微信小程序

创建uni-app项目

3.使用cli创建项目和使用HBuilderX可视化界面创建项目有什么区别

  问题引入:当运行环境版本和编译环境版本两个版本不一致。提示如下:
创建uni-app项目
  出现这个问题原因:HBuilderX版本很老,或cli编译器一直没升级,而云打包服务器已经升级,此时编译环境版本低,而运行环境版本高,就会报错

  如何解决这个问题:如果项目是HBuilderX创建的,则是HBuilderX的版本号,更新HBuilderX会改变;如果是cli创建的项目,即根目录是package.json,那么编译环境版本号是创建cli时生成的,或者上一次执行npm update生成的。不管HBuilderX如何升级,cli项目的编译器并不会跟随HBuilderX升级而升级,需手动升级

  解决这个问题需要知道:HBuilderX 版本 ,HBuilderX 对应的 NPM 依赖版本 ,以及两者关系。例如:版本号 2.0.0- 后面是与 HBuilderX 对应的版本号且小版本不会超过9,比如 HBuilderX 2.7.5.20200518 对应的版本号 2.0.0-27520200518001,2.0.0-271420200618 对应的为 2.0.0-27920200618002。(HBuilderX所有NPM版本记录 )

  本地HBuilderX版本为例
创建uni-app项目
  1)对应编译器版本(HBuilderX安装目录plugin目录下):

创建uni-app项目
  2)本地HBuilderX版本对应NPM版本记录:

创建uni-app项目
  cli项目的编译器版本降级案例
  1)找到cli项目package.json,^2.0.0-32320210825001 全部替换为2.0.0-31920210609001
创建uni-app项目

  2)删除cli项目下的node_modules,package-lock.json
  3)执行npm install
创建uni-app项目

  4)执行npm run dev:h5 访问正常显示
创建uni-app项目

3.1编译器的区别
  • cli创建的项目,编译器安装在项目下。并且不会跟随HBuilderX升级。如需升级编译器,执行 npm update,或者手动修改package.json 中的 uni 相关依赖版本后执行 npm install。更新后可能会有新增的依赖并不会自动安装,手动安装缺少的依赖即可。
  • HBuilderX可视化界面创建的项目,编译器在HBuilderX的安装目录下的plugin目录,随着HBuilderX的升级会自动升级编译器。
  • 已经使用cli创建的项目,如果想继续在HBuilderX里使用,可以把工程拖到HBuilderX中。注意如果是把整个项目拖入HBuilderX,则编译时走的是项目下的编译器。如果是把src目录拖入到HBuilderX中,则走的是HBuilderX安装目录下plugin目录下的编译器。
  • cli版如果想安装less、scss、ts等编译器,需自己手动npm安装。在HBuilderX的插件管理界面安装无效,那个只作用于HBuilderX创建的项目
npm install sass-loader@10  node-sass@4 --save-dev

  sass-loader@11 以上需要是 webpack5,这里示例的uni-app项目是通过vue-cli4生成的(webpack4)。所以这里指定10版本

3.2开发工具的区别
  • cli创建的项目,内置了d.ts,同其他常规npm库一样,可在vscode、webstorm等支持d.ts的开发工具里正常开发并有语法提示。
  • 使用HBuilderX创建的项目不带d.ts,HBuilderX内置了uni-app语法提示库。如需把HBuilderX创建的项目在其他编辑器打开并且补充d.ts,可以在项目下先执行
    npm init,然后npm i @types/uni-app -D,来补充d.ts。但vscode等其他开发工具,在vue或uni-app领域,开发效率比不过HBuilderX。详见:https://ask.dcloud.net.cn/article/35451
  • 发布App时,仍然需要使用HBuilderX。其他开发工具无法发布App,但可以发布H5、各种小程序。如需开发App,可以先在HBuilderX里运行起来,然后在其他编辑器里修改保存代码,代码修改后会自动同步到手机基座。
  • 如果使用cli创建项目,那下载HBuilderX时只需下载10M的标准版即可。因为编译器已经安装到项目下了。
上一篇:uni-app之页面间传递和接收数组


下一篇:uni-app跨平台框架介绍和快速入门