利用Webpack实现小程序多项目管理的方法


Posted in Javascript onFebruary 25, 2019

故事是这样的

产品小姐姐:“我要做一堆小程序,一周上线一到两个没问题吧”
码畜小哥哥:“你他喵是不是傻,做那么多干什么”
产品小姐姐:“蹭些流量呀,用户量多了就可以考虑转化流量给公司的 App”
码畜小哥哥:“fuck 好的”

码畜小哥开始架构

  • 小程序杂,放一个项目方便管理
  • 小程序多,代码要能够复用
  • 团队开发,代码风格要统一

码畜小哥开始建项目

这是单个小程序的基本目录结构,没问题

利用Webpack实现小程序多项目管理的方法

当一个项目有多个小程序的时候,好像也没问题

利用Webpack实现小程序多项目管理的方法

当多个小程序都用到同一个组件 com3 时,小哥发现代码没法复用,需要复制黏贴

利用Webpack实现小程序多项目管理的方法

思考了一下,那么把组件目录移到外面,这样不就可以复用了吗

利用Webpack实现小程序多项目管理的方法

感觉很好,小哥这时在微信开发者工具打开 demo1,发现报错了

利用Webpack实现小程序多项目管理的方法

原来小程序是以当前项目作为根目录,components 目录已经不在 demo1 目录范围内,所以是引用不到的

小哥想到了 Webpack

1. 整理目录

  1. apps/:存放全部小程序
  2. build/:存放构建脚本
  3. common/:存放公共方法
  4. components/:存放公共组件
  5. styles/:存放公共样式
  6. templates/:存放公共模板

大概长这样

利用Webpack实现小程序多项目管理的方法

2. 编写构建脚本

package.json

script: {
 "dev": "webpack --config build/webpack.config.js"
}

build/webpack.config.js

思路就是利用 CopyWebpackPlugin 同步指定的文件到小程序目录下
const CopyWebpackPlugin = require('copy-webpack-plugin')
const utils = require('./utils')

// 获取 apps 目录下的小程序并指定公共文件目录命名
function copyToApps(dir) {
 let r = []

 utils
  .exec(`cd ${utils.resolve('apps')} && ls`)
  .split('\n')
  .map(app => {
   r.push({
    from: utils.resolve(dir),
    to: utils.resolve(`apps/${app}/_${dir}`)
   })
  })

 return r
}

module.exports = {
 watch: true,

 // 监听入口文件,保存便会刷新
 entry: utils.resolve('index.js'),

 output: {
  path: utils.resolve('.tmp'),
  filename: 'bundle.js'
 },

 plugins: [
  // 同步指定的公共文件到所有小程序目录下
  new CopyWebpackPlugin([
   ...copyToApps('styles'),
   ...copyToApps('common'),
   ...copyToApps('templates'),
   ...copyToApps('components')
  ])
 ]
}

3. 启动本地开发

npm run dev

利用Webpack实现小程序多项目管理的方法

利用Webpack实现小程序多项目管理的方法

现在公用的代码已经自动同步到小程序目录下,以下划线开头,当改动公共代码也会自动同步给小程序调用

调用方式长这样

import utils from './_common/utils'
import com3 from './_components/com3'
@import './_styles/index.wxss';
<import src="./_templates/index.wxml" />

代码风格校验

package.json

script: {
 "lint": "eslint apps/"
}

.eslintrc.js

module.exports = {
 extends: 'standard',

 // 将小程序特有的全局变量排除下
 globals: {
  Page: true,
  Component: true,
  App: true,
  getApp: true,
  wx: true
 },

 rules: {
  'space-before-function-paren': ['error', 'never'],
  'no-unused-vars': [
   'error',
   {
    // 小程序还没支持 ES7,这个是用来兼容 async/await
    varsIgnorePattern: 'regeneratorRuntime'
   }
  ]
 }
}

然后借助 husky 在每次 git commit 前执行校验

script: {
 "precommit": "npm run lint"
},

devDependencies: {
 "husky": "^0.14.3"
}

清理

最后小哥还加了个清理命令, 便于重新生成公共代码

package.json

script: {
 "clean": "node build/clean.js"
}

build/clean.js

const rimraf = require('rimraf')
const utils = require('./utils')

function log(dir) {
 console.log(`cleaning ${dir}`)
}

rimraf(utils.resolve('.tmp'), () => log('.tmp'))

utils
 .exec(`cd ${utils.resolve('apps')} && ls`)
 .split('\n')
 .map(app => {
  ;[
   `${app}/_styles`,
   `${app}/_common`,
   `${app}/_templates`,
   `${app}/_components`
  ].map(m => {
   rimraf(utils.resolve(`apps/${m}`), () => log(m))
  })
 })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_05_原型继承原理
Oct 13 Javascript
简单时间提示DEMO从0开始一直进行计时
Nov 19 Javascript
JS表的模拟方法
Feb 05 Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 Javascript
浅谈JavaScript的push(),pop(),concat()方法
Jun 03 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
详解基于angular路由的requireJs按需加载js
Jan 20 Javascript
js实现简易聊天对话框
Aug 17 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 jQuery
JavaScript中构造函数与原型链之间的关系详解
Feb 25 #Javascript
JavaScript中的事件与异常捕获详析
Feb 24 #Javascript
Vue 组件注册实例详解
Feb 23 #Javascript
Vue Prop属性功能与用法实例详解
Feb 23 #Javascript
Vue自定义属性实例分析
Feb 23 #Javascript
Vue动态组件与异步组件实例详解
Feb 23 #Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
Feb 22 #Javascript
You might like
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
js常用函数 不错
2006/09/08 Javascript
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
python实现键盘控制鼠标移动
2020/11/27 Python
python实现彩色图转换成灰度图
2019/01/15 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Django异步任务线程池实现原理
2019/12/17 Python
python中round函数如何使用
2020/06/19 Python
Django xadmin安装及使用详解
2020/10/26 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
医药工作岗位求职信分享
2013/12/31 职场文书
四下基层实施方案
2014/03/28 职场文书
学校花圃的标语
2014/06/18 职场文书
入党积极分子群众意见
2015/06/01 职场文书
AJAX学习笔记
2021/05/18 Javascript
Python基于百度AI实现抓取表情包
2021/06/27 Python