摘要:目前來說,對于構(gòu)建小程序的,類似這些框架,生態(tài)已經(jīng)挺完善的了,沒有什么必要再搞一套來折騰自己。我們負(fù)責(zé)人終于受不了了,給了我個任務(wù),讓我寫一個構(gòu)建小程序的工具,減少小程序包體積。
目前來說,對于構(gòu)建小程序的,類似taro這些框架,生態(tài)已經(jīng)挺完善的了,沒有什么必要再搞一套來折騰自己。但是,我司的小程序,是很早之前就開發(fā)的,我們負(fù)責(zé)人當(dāng)時信不過這些開源的框架,于是自己用webpack搞了一套框架,但有一個比較嚴(yán)重的問題,有一些文件依賴重復(fù)打包了,導(dǎo)致小程序包體積比較大。
持續(xù)了一個多月,主包體積在2M左右徘徊,開發(fā)都很難做下去。我們負(fù)責(zé)人終于受不了了,給了我個任務(wù),讓我寫一個構(gòu)建小程序的工具,減少小程序包體積。
我們現(xiàn)在的框架對比一下原生小程序,其實差別不大,無非就是
ts => js sass=>wxss wxml=>wxml json=>json
由于我司小程序基礎(chǔ)庫是1.9.8的,不支持構(gòu)建npm,所以node_modules的依賴包以及依賴路徑需要自己處理,于是寫了一個babel插件 babel-plugin-copy-npm。
這么一想,其實不難,而且單文件編譯,那不是gulp的強項嗎?。?!
最終效果:
而且由于增量更新,只修改改變的文件,所以編譯的速度非???。
項目地址:https://github.com/m-Ryan/ry-wx
最終流程大概如下:清除dist目錄下的文件 => 編譯文件到dist目錄下=> 開發(fā)模式監(jiān)聽文件更改,生產(chǎn)環(huán)境壓縮文件。
一、清除dist目錄下的文件 (clean.js)
const del = require("del"); const fs = require("fs"); const path = require("path"); const cwd = process.cwd(); module.exports = function clean() { if (!fs.existsSync(path.join(cwd, "dist"))) { fs.mkdirSync("dist"); return Promise.resolve(null); } return del([ "*", "!npm" ], { force: true, cwd: path.join(cwd, "dist") }); };
二、編譯文件
1.編譯typescript(compileJs.js)
const gulp = require("gulp"); const { babel } = require("gulp-load-plugins")(); const path = require("path"); const cwd = process.cwd(); module.exports = function compileJs(filePath) { let file = "src/**/*.ts"; let dist = "dist"; if (typeof filePath === "string") { file = path.join(cwd, filePath); dist = path.dirname(file.replace(/src/, "dist")); } return gulp.src(file).pipe(babel()).pipe(gulp.dest(dist)); };
2.編譯sass(compileSass.js)
const gulp = require("gulp"); const { sass, postcss, rename } = require("gulp-load-plugins")(); const path = require("path"); const cwd = process.cwd(); const plugins = [ require("autoprefixer")({ browsers: [ "ios >= 8", "ChromeAndroid >= 53" ], remove: false, add: true }), require("postcss-pxtorpx")({ multiplier: 2, propList: [ "*" ] }) ]; module.exports = function compileSass(filePath) { let file = "src/**/*.scss"; let dist = "dist"; if (typeof filePath === "string") { file = path.join(cwd, filePath); dist = path.dirname(file.replace(/src/, "dist")); } return gulp .src(file) .pipe(sass({ outputStyle: "compressed" }).on("error", sass.logError)) .pipe(postcss(plugins)) .pipe( rename({ extname: ".wxss" }) ) .pipe(gulp.dest(dist)); };
編譯json,wxml,由于需要壓縮,所以需要分開處理
(copyJson.js)
const gulp = require("gulp"); module.exports = function copyJson() { let file = "src/**/*.json"; let dist = "dist"; if (typeof filePath === "string") { file = path.join(cwd, filePath); dist = path.dirname(file.replace(/src/, "dist")); } return gulp.src([ file ]).pipe(gulp.dest(dist)); };
(copyWxml.js)
const gulp = require("gulp"); const minifyHtml = require("gulp-html-minify"); module.exports = function copyWxmlFiles() { let file = "src/**/*.wxml"; let dist = "dist"; if (typeof filePath === "string") { file = path.join(cwd, filePath); dist = path.dirname(file.replace(/src/, "dist")); } return gulp.src(file).pipe(minifyHtml()).pipe(gulp.dest(dist)); };
4.拷貝其他靜態(tài)資源,例如字體、圖片
(copyAssets.js)
const gulp = require("gulp"); module.exports = function copyAssets() { let file = "src/**/**"; let dist = "dist"; if (typeof filePath === "string") { file = path.join(cwd, filePath); dist = path.dirname(file.replace(/src/, "dist")); } return gulp .src([ file, "!**/*.json", "!**/*.ts", "!**/*.js", "!**/*.scss", "!**/*.wxml" ]) .pipe(gulp.dest(dist)); };
5.引入文件(gulpfile.js)
const gulp = require("gulp"); const clean = require("./build/clean"); const compileJs = require("./build/compileJs"); const compileSass = require("./build/compileSass"); const copyJson = require("./build/copyJson"); const copyWxml = require("./build/copyWxml"); const copyAssets = require("./build/copyAssets"); const fs = require("fs-extra"); const path = require("path"); const chalk = require("chalk"); const cwd = process.cwd(); const dayjs = require("dayjs"); const tasks = [ clean, gulp.parallel([compileJs, compileSass, copyJson, copyWxml]), copyAssets ]; if (process.env.NODE_ENV === "development") { tasks.push(watch); } gulp.task("default", gulp.series(tasks)); gulp.task("watch", watch); function watch() { console.log(chalk.blue(`正在監(jiān)聽文件... ${getNow()}`)); const watcher = gulp.watch("src/**/**"); watcher.on("change", function(filePath, stats) { compile(filePath); }); watcher.on("add", function(filePath, stats) { compile(filePath); }); watcher.on("unlink", function(filePath, stats) { let distFile = filePath.replace(/^src/, "dist"); let absolutePath = ""; if (distFile.endsWith(".ts")) { distFile = distFile.replace(/.ts$/, ".js"); } else if (distFile.endsWith(".scss")) { distFile = distFile.replace(/.scss$/, ".wxss"); } absolutePath = path.join(cwd, distFile); if (fs.existsSync(absolutePath)) { fs.unlinkSync(absolutePath); console.log( chalk.yellow(`刪除文件:${path.basename(distFile)} ${getNow()}`) ); } }); } function compile(filePath) { console.info( chalk.green(`編譯完成:${path.basename(filePath)} ${getNow()}`) ); if (filePath.endsWith(".ts")) { compileJs(filePath); } else if (filePath.endsWith(".scss")) { compileSass(filePath); } else if (filePath.endsWith(".wxml")) { copyWxml(filePath); } else if (filePath.endsWith(".json")) { copyJson(filePath); } else { copyAssets(filePath); } } function getNow() { return dayjs().format("HH:mm:ss"); }
babel的配置如下.babelrc.js
const babelOptions = { presets: [ "@babel/preset-typescript", [ "@babel/env" ] ], plugins: [ "lodash", [ "@babel/plugin-proposal-decorators", { legacy: true } ], "babel-plugin-add-module-exports", [ "@babel/plugin-transform-runtime", { corejs: false, helpers: true, regenerator: true, useESModules: false } ], [ "module-resolver", { root: [ "." ], alias: { "@": "./src" } } ], [ "babel-plugin-copy-npm", { rootDir: "src", outputDir: "dist", npmDir: "npm", format: "cjs", strict: false, minify: true, loose: true, cache: true } ] ] }; if (process.env.NODE_ENV === "production") { babelOptions.presets.unshift([ "minify", { mangle: { exclude: [ "wx", "module", "exports", "__wxConfigx", "process", "global" ] }, keepFnName: true } ]); } module.exports = babelOptions;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104291.html
摘要:三配置環(huán)節(jié)目的一是為之后的環(huán)節(jié)初始化工作流參數(shù),二是準(zhǔn)備好應(yīng)用文件夾內(nèi)容即要打包的目標(biāo)文件夾做的事解析命令行參數(shù),初始化工作參數(shù),填充配置文件,把配置文件和相關(guān)依賴文件導(dǎo)入到文件夾內(nèi)合適的 首發(fā)于酷家樂前端博客,作者@摘星(segmentfault @StinsonZhao) 我們能從很多地方學(xué)習(xí)到怎么起一個 Electron 項目,有些還會介紹怎么打包或構(gòu)建你的代碼,但距離「真正地...
摘要:為何選擇引擎微信小游戲推出之后,很多公司也相應(yīng)的進入到微信小游戲這個領(lǐng)域,現(xiàn)在市場上的游戲開發(fā)引擎,如都對小游戲有了很好的兼容性。 1. 為何選擇Laya引擎 微信小游戲推出之后,很多公司也相應(yīng)的進入到微信小游戲這個領(lǐng)域,現(xiàn)在市場上的游戲開發(fā)引擎,如Cocos、Egret、Laya都對小游戲有了很好的兼容性。目前公司技術(shù)棧主要是使用Cocos和Laya,經(jīng)過幾個項目的接觸,考量了引擎在...
摘要:不過,相對于靜態(tài)類型檢查帶來的好處,這些代價是值得的。當(dāng)然少不了的模塊化標(biāo)準(zhǔn),雖然到目前為止和大部分瀏覽器都還不支持它。本身支持兩種模塊化方式,一種是對的模塊的微小擴展,另一種是在發(fā)布之前本身模仿的命名空間。有一種情況例外。 TypeScript 帶來的最大好處就是靜態(tài)類型檢查,所以在從 JavaScript 轉(zhuǎn)向 TypeScript 之前,一定要認(rèn)識到添加類型定義會帶來額外的工作量...
摘要:簡單做點通俗的講解。如果你想要創(chuàng)建一個序列化的隊列,并以特定的順序執(zhí)行,嗯,戳文檔文檔。自然是表示任意,全部。到這里,其實就是一個小規(guī)模的調(diào)試環(huán)境,接下來,讓我們升級一下,開始構(gòu)造簡單的發(fā)布環(huán)境壓縮采用的是插件。做一個的就好,只需要。 gulp作為一個自動化構(gòu)建工具,在前端開發(fā)中大大的提高了開發(fā)效率,前端開發(fā)者們可以利用他減少許多繁復(fù)無腦的操作。這里簡單構(gòu)建一個小環(huán)境,就可以在以后的學(xué)...
摘要:簡介前端發(fā)展迅速,開發(fā)者富有的創(chuàng)造力不斷的給前端生態(tài)注入新生命,各種庫框架工程化構(gòu)建工具層出不窮,眼花繚亂,不盲目追求前沿技術(shù),學(xué)習(xí)框架和庫在滿足自己開發(fā)需求的基礎(chǔ)上,然后最好可以對源碼進行調(diào)研,了解和深入實現(xiàn)原理,從中可以獲得更多的收獲隨 showImg(https://segmentfault.com/img/remote/1460000016784101?w=936&h=397)...
閱讀 763·2021-08-17 10:11
閱讀 1619·2019-08-30 11:15
閱讀 1048·2019-08-26 13:54
閱讀 3533·2019-08-26 11:47
閱讀 1248·2019-08-26 10:20
閱讀 2848·2019-08-23 18:35
閱讀 1244·2019-08-23 17:52
閱讀 1322·2019-08-23 16:19