利用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 相关文章推荐
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
基于jquery的仿百度搜索框效果代码
Apr 11 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
JQuery的$命名冲突详细解析
Dec 28 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
Dec 02 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 Javascript
vuejs绑定class和style样式
Apr 11 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
JavaScript执行环境及作用域链实例分析
Aug 01 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
Aug 14 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 Mssql操作简单封装支持存储过程
2009/12/11 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
JS实现多选框的操作
2020/06/24 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
python中hashlib模块用法示例
2017/10/30 Python
解决DataFrame排序sort的问题
2018/06/07 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
Python字符串对象实现原理详解
2019/07/01 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
ubuntu上安装python的实例方法
2019/09/30 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
华为C++笔试题
2014/08/05 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
自我鉴定注意事项
2014/01/19 职场文书
中学家长会邀请函
2014/02/03 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
先进典型事迹材料
2014/12/29 职场文书
golang日志包logger的用法详解
2021/05/05 Golang