<code id="e0g88"></code>
    <output id="e0g88"></output>

      <output id="e0g88"></output>
      1. 
        <thead id="e0g88"><sup id="e0g88"></sup></thead>
        <thead id="e0g88"><sup id="e0g88"></sup></thead>

        1. <meter id="e0g88"><menuitem id="e0g88"></menuitem></meter>

          1. <thead id="e0g88"><sup id="e0g88"></sup></thead>

          2. <dl id="e0g88"></dl>
            <div id="e0g88"></div><li id="e0g88"></li>
            <sup id="e0g88"></sup>
            <sup id="e0g88"><menu id="e0g88"></menu></sup>
            <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><small id="e0g88"></small></ins></dl>
          3. <li id="e0g88"></li>
          4. <dl id="e0g88"><menu id="e0g88"></menu></dl>
            <optgroup id="e0g88"><bdo id="e0g88"></bdo></optgroup>
            <sup id="e0g88"><menu id="e0g88"></menu></sup>
          5. <div id="e0g88"></div>
            <div id="e0g88"><tr id="e0g88"><object id="e0g88"></object></tr></div>
            <dl id="e0g88"></dl>
            <div id="e0g88"><s id="e0g88"></s></div>
          6. <li id="e0g88"><s id="e0g88"></s></li>
          7. <dl id="e0g88"></dl>
            <dl id="e0g88"></dl>
          8. <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><thead id="e0g88"></thead></ins></dl>
            联系我们 服务热线020-87723646
            当前位置:首页 > 微信开发知识 > 正文

            如何快速又高效地编写微信小程序?

            2017-05-19 10:00:39

                    广州小程序开发正在互联觉得,微信小程序是一个工程,就和盖房子一样,打好了地基,才能保证后续工程师建立在可靠牢固的基础上。


                    微信小程序开发者需要经常新建项目,每次都要重?#30784;?#20462;改项目结构 -> 从老项目中复制?#31243;?#25991;件 -> 删除一些老项目?#20889;?#30721;”这样的过程,实在是…费心费力。另一个痛点是?#22909;?#27425;新建小程序页面要生成三个文件名相同的文件 ( .wxml、.wxss 和 .js ),命令行太长(据微信同事:也可以在 app.json 的 pages 字段下添加新页面的路径,保存后也会生成对应的文件)。



                    目标

                    我们现在有两个目标:

                    1、根据通用模板新建项目

                    2、一键新建页面目录以及在目录中的三个文件 :.wxml、 .wxss 和 .js也可以直接在 app.json 的 pages 字段创建页面,保存后生成这三个文件。笔者没有采用这个方法的缘由一个是开始时不知道?#20889;?#21151;能,另一个是不合平时的操作习惯,再者想到 js 文件初始化后,需要引入常用库,要插入代码片段,所以保留了这个功能。

                    这两个需求其实很简单,不需要 GUI,所以我们可以做一个 npm 命令行工具。想象一下这个命令行用起来应该是什么样的呢:

                    ~ npminstallwxapp -g ~ wxapp -i myapp && cd myapp ~ wxapp -plist

                    用流程图示意就是:

            北京网站建设资讯 - 如何高效编写微信小程序? - (1)

                    实现

                    正式开始之前,请?#28909;?#35748;本地的开发环?#24120;?#24320;发者的本地环境是:

                    ~npm-v3.10.10~node-vv6.9.4

                    我们把问题分解为三步:

                    1、实?#32622;?#20196;行工具,可以在?#25105;?#30446;录直接运行

                    2、通过输入不同的命令行?#38382;?#20197;执行不同的功能

                    3、考虑项目模板的存放位置,是集成到工具中,还是和工具分开呢

                    不用担心,都很容易解决,我们一个个?#30784;?

                    命令行工具

                    package.json 中有一个字段是 bin:

                    { ..."bin": {"mywxapp":"./index.js"} }
                    这个字段可以将开发者希望执行的脚本注册到环境变量 (PATH) 中,不同的 key 对应执行不同的脚本。也就是说现在,当我们直接在命令行中执行:
                    ~ mywxapp

                    等价于在 terminal 中执行:

                    ~/path/to/index.js


                  


                    执行 index.js ?#20445;?#21487;以通过 process.argv 获取执行时的?#38382;?#20294;是要从?#38382;?#25968;组中拆分出?#38382;?#26080;疑很麻烦。不过,npm 发展?#20004;瘢?#22788;理命令行?#38382;?#30340;库肯定存在,就是commander。简单好用易上手,那么第二个问题也解决啦。



                    项目模板的存放位置

                    考虑项目模板的存放位置,是集成到工具中,还是和工具分开呢?


                    开发者选择分开管理。 在一个单独的模板代码仓库中管理模板内容,方便我们维护。目前的模板还比较简单(详见下文“模板详解?#20445;?#21482;有标准目录结构,预期后面会加上自动化的部分(比如 less -> wxss),所以未来会改动比较频繁。


                    download-git-repo 可以把给定地址的仓库内容拷贝到执行目录?#23567;PI 简单,所以就是它了。


                    问题都解决了,现在就让我们看?#27425;?#20195;码(注意?#20309;?#30721;中没有考虑出错情况):

            const mkdirp = require(\'mkdirp\'); const download = require(\'download-git-repo\'); // 创建项目functioninitProj(projName){if(currentDir.exsits(projName)) console.warn(projName \'项目已经存在于当前目录中,请使用别的名字\');elsedownload(\'path/to/tmpl\', currentDir \'/\'projName); } // 注册页面functionregisterPage(pagesName) { // 读配置文件readFile(configFile,function(data){ // 将新建的所有页面都写入配置文件中for(nameinpagesName){ data.pages.push(\'pages/\'name \'/\'name); } writeFile(configFile); }); } // 创建页面functioncreatePage(pages) {for(var indexinpages) { var page = pages[index]; mkdirp(pagePath,function(){ createFile(page \'.wxml\'); createFile(page \'.wxss\'); createFile(page \'.js\'); }) } // 将页面注册到 app.json 中 registerPage(pages); }



                    使用

                    在编写好了这个工具之后,只需要在本地全局使用的话:

                    npminstall -g

                    在本地开发过程中,如果更新了开发版本的代码,需要更新同步到全局,这时候需要执行:

                    npmlink


                    就会看到安装到环境变量中的工具目录地址已经和开发目录关联起来了:

            ~/Documents/kmokidd/cli-build$npmlink/usr/local/bin/wxapp -> /usr/local/lib/node_modules/@kmokidd/wxapp-generator/index.js/usr/local/bin/node_modules/@kmokidd/wxapp-generator -> /Users/kmokidd/Documents/kmokidd/cli-build/index.js



                    使用起来是这样的:




                    发布 NPM 插件

                    如果和笔者一样,希望在多个机器上使用这个工具,可以选择发布到 npm 官网上。发布步骤非常简单,基本上就是:

                    npmloginnpmpublish

                    不过广州微信小程序开发正在互联考虑到,项目模板毕竟是因人而异的东西,所以选择了发布 scope package,也就是在插件的 package.json 中的 name 字段使用 @scopeName/wxapp-generator 这样的值。

                    如果你也有类似的想法,并且也是个 npm 免费用户,那么发布的时候要执行:

                    npmpublish --access public

                    scope 对使用没有任何影响,但是安装的时候要记得带上 scope name 执行:

                    [email protected]/wxapp-generator-g

                    模板详解

                    一千个人中有一千种项目模板。根据业务/个人爱好不同,大家的项目模板可能也相去甚远。笔者自觉目前的模板用起来还不错,将在这一节介绍一下。以下是项目的文件结构:

                    wxapp ├── app.js ├── app.json ├── app.wxss ├──base-styles/ ├── images/ ├── pages/ │ ├── tmpl/ ├── utils / │ ├── view.js │ ├── util.js │ ├── polyfiil.js └── └── Deferred.js

                    之所以采用这样的结构,是希望尽可能解耦 UI 逻辑与业务逻辑。但是由于完全解耦是不可能的,基本思路是单纯的“变量分离”。通常 UI 的改变是通过 class 的切换或者内联样式的调整,所以笔者的思路,是将“要切换的 class”或者“要调整的内联样式”作为变量,由于大部分情况下业务逻辑和 UI 变化是联动的,通过抽离出来的变量,实现在业务逻辑中简单直白地改变 UI。


                    可能看到这里,读者会有些困惑,那让我们直接以「企鹅听书」为例,具象地看看笔者是怎么做的吧。听书的界面会出现变化的时以下两种场景:

                    1、一共有两种播放器:minibar 和 全屏的播放器,播放器的播放按钮?#23567;安?#25918;”和“暂停”两种状态(图片)切换,这个可以通过 class 来控制。

                    2、当播放器进入全屏模式后,节目列表将被隐藏;点击箭头以后,节目列表将重新显示出?#30784;?/span>


                    上文的文件结构中的 view.js 就是 UI 逻辑的代码。pages/ 目录中的 js 文件将通过import 引用 view.js,view.js 中的接口分为“通用”和“页面使用”这两个类?#20572;?

            module.exports = { // 通用 general: { hide: \'hide\', // 变量分离在此 show: \'show\'}, // 播放器页面 playerView : { class: { listItemPlaying: \'playing\'} } // 其他页面如果也有需要,以页面为单位添加... }


                    如果未来出现更多 UI 变化的场景,可以再通过变量添加上去,比如 pageView.id。

                    举个超?#37117;?#21333;的例子(如下),模拟工作流程:

            北京网站建设资讯 - 如何高效编写微信小程序? - (3)

            1. 在 wxss 中定义好控制不同样式的 class
            2. 将需要变化的 class 写到 view.js 中,并暴露接口
            3. 在 wxml 中的对应结构中绑定 event handler
            4. 在对应的 page.js 里实现 event handler 的具体内容,也就是切换 class 的触发条件


                    老司机一看就知道是 MVVC 模式,这样分离也就是为了 UI 有独立的控制器,不至于和业务逻辑耦合严重,在页面开发的阶段就可以完成 UI 上的变化。从这个角度上看,小程序反而能给 UI 工程师更多控制 UI 逻辑的能力,确定好代码规范和接口。

                    总结

                    初始化一个项目是开始编码的第一步,值得多花一些时间找到合适团队合?#39318;?#24049;的项目模板。

            推荐阅读

            现在开始您的?#25918;?#20043;旅

            在线留言

            售前 售后 建议 应聘
            时时彩数据统计app
              <code id="e0g88"></code>
              <output id="e0g88"></output>

                <output id="e0g88"></output>
                1. 
                  <thead id="e0g88"><sup id="e0g88"></sup></thead>
                  <thead id="e0g88"><sup id="e0g88"></sup></thead>

                  1. <meter id="e0g88"><menuitem id="e0g88"></menuitem></meter>

                    1. <thead id="e0g88"><sup id="e0g88"></sup></thead>

                    2. <dl id="e0g88"></dl>
                      <div id="e0g88"></div><li id="e0g88"></li>
                      <sup id="e0g88"></sup>
                      <sup id="e0g88"><menu id="e0g88"></menu></sup>
                      <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><small id="e0g88"></small></ins></dl>
                    3. <li id="e0g88"></li>
                    4. <dl id="e0g88"><menu id="e0g88"></menu></dl>
                      <optgroup id="e0g88"><bdo id="e0g88"></bdo></optgroup>
                      <sup id="e0g88"><menu id="e0g88"></menu></sup>
                    5. <div id="e0g88"></div>
                      <div id="e0g88"><tr id="e0g88"><object id="e0g88"></object></tr></div>
                      <dl id="e0g88"></dl>
                      <div id="e0g88"><s id="e0g88"></s></div>
                    6. <li id="e0g88"><s id="e0g88"></s></li>
                    7. <dl id="e0g88"></dl>
                      <dl id="e0g88"></dl>
                    8. <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><thead id="e0g88"></thead></ins></dl>
                        <code id="e0g88"></code>
                        <output id="e0g88"></output>

                          <output id="e0g88"></output>
                          1. 
                            <thead id="e0g88"><sup id="e0g88"></sup></thead>
                            <thead id="e0g88"><sup id="e0g88"></sup></thead>

                            1. <meter id="e0g88"><menuitem id="e0g88"></menuitem></meter>

                              1. <thead id="e0g88"><sup id="e0g88"></sup></thead>

                              2. <dl id="e0g88"></dl>
                                <div id="e0g88"></div><li id="e0g88"></li>
                                <sup id="e0g88"></sup>
                                <sup id="e0g88"><menu id="e0g88"></menu></sup>
                                <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><small id="e0g88"></small></ins></dl>
                              3. <li id="e0g88"></li>
                              4. <dl id="e0g88"><menu id="e0g88"></menu></dl>
                                <optgroup id="e0g88"><bdo id="e0g88"></bdo></optgroup>
                                <sup id="e0g88"><menu id="e0g88"></menu></sup>
                              5. <div id="e0g88"></div>
                                <div id="e0g88"><tr id="e0g88"><object id="e0g88"></object></tr></div>
                                <dl id="e0g88"></dl>
                                <div id="e0g88"><s id="e0g88"></s></div>
                              6. <li id="e0g88"><s id="e0g88"></s></li>
                              7. <dl id="e0g88"></dl>
                                <dl id="e0g88"></dl>
                              8. <li id="e0g88"><s id="e0g88"></s></li><dl id="e0g88"><ins id="e0g88"><thead id="e0g88"></thead></ins></dl>