利用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 &amp; DHTML 实例编程(教程)基础知识
Jun 02 Javascript
JavaScript 仿关机效果的图片层
Dec 26 Javascript
验证javascript中Object和Function的关系的三段简单代码
Jun 27 Javascript
nullJavascript中创建对象的五种方法实例
May 07 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
node.js中的fs.futimes方法使用说明
Dec 17 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
Mar 01 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 Javascript
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
PHP命名空间和自动加载类
2016/04/03 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
巧用canvas
2017/01/21 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Django REST 异常处理详解
2020/07/15 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
大学生工作推荐信范文
2013/12/02 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
先进基层党组织材料
2014/12/25 职场文书
旷课检讨书
2015/01/26 职场文书
2015年中个人总结范文
2015/03/10 职场文书
小学远程教育工作总结
2015/08/13 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
mysql数据库实现设置字段长度
2022/06/10 MySQL