
前端开发小哥 Bingo 接到了产品小姐姐的需求,要上线多个小程序.
这是单个小程序的基本目录结构,没问题
当一个项目有多个小程序的时候,好像也没问题
当多个小程序都用到同一个组件 com3 时,小哥发现代码没法复用,需要复制黏贴
思考了一下,那么把组件目录移到外面,这样不就可以复用了吗?
感觉很好,小哥这时在微信开发者工具打开 demo1,发现报错了
原来小程序是以当前项目作为根目录,components 目录已经不在 demo1 目录范围内,所以是引用不到的
大概长这样
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') ]) ] } npm run dev 现在公用的代码已经自动同步到小程序目录下,以下划线开头,当改动公共代码也会自动同步给小程序调用
调用方式长这样
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)) }) }) “可以下班追剧了”
考拉前端开发小哥 Bingo,钻研小程序开发。
1 airyland 2019-04-18 12:05:17 +08:00 解决了问题,但是公用组件修改后还需要去确认调用的多个项目是否不兼容或者有 bug。还不如变成 pm 发布的形式来调用,可以有 changelog,需要更新的人有意识地测试是否有 bug。 |
2 mscststs 2019-04-18 13:57:03 +08:00 我投一票 npm publish |
3 zbinlin 2019-04-18 14:07:45 +08:00 nodejs 的项目,我都是通过 submodule + package.json 来管理公共的,但不方便(或没必要) publish 到 npm 的模块。 |
4 meepo3927 2019-04-18 15:00:44 +08:00 吊的一 b |