利用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 相关文章推荐
用jscript启动sqlserver
Jun 21 Javascript
javascript 框架小结 个人工作经验
Jun 13 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
20分钟打造属于你的Bootstrap站点
Jul 27 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
Oct 16 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
Vue渲染过程浅析
Mar 14 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
react实现antd线上主题动态切换功能
Aug 12 Javascript
vue实现列表垂直无缝滚动
Apr 08 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
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
详解Python中的四种队列
2018/05/21 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python玩转PDF的各种骚操作
2019/05/06 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
Python流程控制 if else实现解析
2019/09/02 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
活动宣传策划方案
2014/05/23 职场文书
任命书格式
2014/06/05 职场文书
中考标语大全
2014/06/05 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
骨干教师事迹材料
2014/12/17 职场文书
财务经理岗位职责
2015/01/31 职场文书
大学学生会辞职信
2015/05/13 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server