利用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 相关文章推荐
dess中一个简单的多路委托的实现
Jul 20 Javascript
Javascript insertAfter() 实现函数代码
Oct 12 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
AngularJS基础 ng-copy 指令实例代码
Aug 01 Javascript
最原始的jQuery注册验证方式
Oct 11 Javascript
js获取指定时间的前几秒
Apr 05 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
Sep 08 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脚本的10个技巧(5)
2006/10/09 PHP
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
微信API接口大全
2015/04/15 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
简单的命令查看安装的python版本号
2020/08/28 Python
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
几个数据库方面的面试题
2016/07/01 面试题
文秘应聘自荐书范文
2014/02/18 职场文书
经济类毕业生求职信
2014/06/26 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
Python天气语音播报小助手
2021/09/25 Python