摘要:目前來說,對于構建小程序的,類似這些框架,生態已經挺完善的了,沒有什么必要再搞一套來折騰自己。我們負責人終于受不了了,給了我個任務,讓我寫一個構建小程序的工具,減少小程序包體積。
目前來說,對于構建小程序的,類似taro這些框架,生態已經挺完善的了,沒有什么必要再搞一套來折騰自己。但是,我司的小程序,是很早之前就開發的,我們負責人當時信不過這些開源的框架,于是自己用webpack搞了一套框架,但有一個比較嚴重的問題,有一些文件依賴重復打包了,導致小程序包體積比較大。
持續了一個多月,主包體積在2M左右徘徊,開發都很難做下去。我們負責人終于受不了了,給了我個任務,讓我寫一個構建小程序的工具,減少小程序包體積。
我們現在的框架對比一下原生小程序,其實差別不大,無非就是
ts => js sass=>wxss wxml=>wxml json=>json
由于我司小程序基礎庫是1.9.8的,不支持構建npm,所以node_modules的依賴包以及依賴路徑需要自己處理,于是寫了一個babel插件 babel-plugin-copy-npm。
這么一想,其實不難,而且單文件編譯,那不是gulp的強項嗎!!!
最終效果:
而且由于增量更新,只修改改變的文件,所以編譯的速度非常快。
項目地址:https://github.com/m-Ryan/ry-wx
最終流程大概如下:清除dist目錄下的文件 => 編譯文件到dist目錄下=> 開發模式監聽文件更改,生產環境壓縮文件。
一、清除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.拷貝其他靜態資源,例如字體、圖片
(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(`正在監聽文件... ${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;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104291.html
摘要:三配置環節目的一是為之后的環節初始化工作流參數,二是準備好應用文件夾內容即要打包的目標文件夾做的事解析命令行參數,初始化工作參數,填充配置文件,把配置文件和相關依賴文件導入到文件夾內合適的 首發于酷家樂前端博客,作者@摘星(segmentfault @StinsonZhao) 我們能從很多地方學習到怎么起一個 Electron 項目,有些還會介紹怎么打包或構建你的代碼,但距離「真正地...
摘要:為何選擇引擎微信小游戲推出之后,很多公司也相應的進入到微信小游戲這個領域,現在市場上的游戲開發引擎,如都對小游戲有了很好的兼容性。 1. 為何選擇Laya引擎 微信小游戲推出之后,很多公司也相應的進入到微信小游戲這個領域,現在市場上的游戲開發引擎,如Cocos、Egret、Laya都對小游戲有了很好的兼容性。目前公司技術棧主要是使用Cocos和Laya,經過幾個項目的接觸,考量了引擎在...
摘要:不過,相對于靜態類型檢查帶來的好處,這些代價是值得的。當然少不了的模塊化標準,雖然到目前為止和大部分瀏覽器都還不支持它。本身支持兩種模塊化方式,一種是對的模塊的微小擴展,另一種是在發布之前本身模仿的命名空間。有一種情況例外。 TypeScript 帶來的最大好處就是靜態類型檢查,所以在從 JavaScript 轉向 TypeScript 之前,一定要認識到添加類型定義會帶來額外的工作量...
摘要:簡單做點通俗的講解。如果你想要創建一個序列化的隊列,并以特定的順序執行,嗯,戳文檔文檔。自然是表示任意,全部。到這里,其實就是一個小規模的調試環境,接下來,讓我們升級一下,開始構造簡單的發布環境壓縮采用的是插件。做一個的就好,只需要。 gulp作為一個自動化構建工具,在前端開發中大大的提高了開發效率,前端開發者們可以利用他減少許多繁復無腦的操作。這里簡單構建一個小環境,就可以在以后的學...
閱讀 732·2021-08-17 10:11
閱讀 1598·2019-08-30 11:15
閱讀 1020·2019-08-26 13:54
閱讀 3508·2019-08-26 11:47
閱讀 1220·2019-08-26 10:20
閱讀 2820·2019-08-23 18:35
閱讀 1217·2019-08-23 17:52
閱讀 1299·2019-08-23 16:19