利用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 相关文章推荐
一个JS翻页效果
Jul 23 Javascript
最简单的jQuery程序 入门者学习
Jul 09 Javascript
javascript点击按钮实现隐藏显示切换效果
Feb 03 Javascript
浅析JavaScript回调函数应用
May 22 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
Dec 06 Javascript
深入浅析Vue 中 ref 的使用
Apr 29 Javascript
vue 动态组件用法示例小结
Mar 06 Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 Javascript
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP Pear 安装及使用
2009/03/19 PHP
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
浅析is_writable的php实现
2013/06/18 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
jquery parent和parents的区别分析
2013/10/02 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Python Requests安装与简单运用
2016/04/07 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Random 在 Python 中的使用方法
2018/08/09 Python
python文件和文件夹复制函数
2020/02/07 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
最新大学生自我评价
2013/09/24 职场文书
大学毕业感言一句话
2014/02/06 职场文书
廉政教育的心得体会
2014/09/01 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书