亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

gulp構建小程序的方法步驟

2019-11-19 11:25:10
字體:
來源:轉載
供稿:網友

目前來說,對于構建小程序的,類似taro這些框架,生態已經挺完善的了,沒有什么必要再搞一套來折騰自己。但是,我司的小程序,是很早之前就開發的,我們負責人當時信不過這些開源的框架,于是自己用webpack搞了一套框架,但有一個比較嚴重的問題,有一些文件依賴重復打包了,導致小程序包體積比較大。

持續了一個多月,主包體積在2M左右徘徊,開發都很難做下去。我們負責人終于受不了了,給了我個任務,讓我寫一個構建小程序的工具,減少小程序包體積。

我們現在的框架對比一下原生小程序,其實差別不大,無非就是

 ts => jssass=>wxsswxml=>wxmljson=>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/b/, "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;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区精品久久久| 久久久久久久国产精品| 欧美孕妇毛茸茸xxxx| 亚洲第一免费播放区| 欧美大秀在线观看| 欧美日韩在线免费| 91产国在线观看动作片喷水| 日韩欧美精品中文字幕| 日韩av中文字幕在线播放| 色婷婷综合久久久久中文字幕1| 亚洲欧美国产精品| 亚洲国产成人精品久久| 亚洲free嫩bbb| 久久精品久久久久电影| 一区二区三区四区在线观看视频| 亚洲欧美另类中文字幕| 91久久精品久久国产性色也91| 亚洲专区在线视频| 爱福利视频一区| 日韩免费在线免费观看| 亚洲欧美精品在线| 亚洲福利视频专区| 亚洲黄色有码视频| 日韩最新中文字幕电影免费看| 韩国视频理论视频久久| 久久不射电影网| 久久影视电视剧凤归四时歌| 国产精品网站大全| 日本成人免费在线| 色哟哟入口国产精品| 亚洲色图美腿丝袜| 日韩三级成人av网| 日韩av在线免费观看一区| 欧美尺度大的性做爰视频| 55夜色66夜色国产精品视频| 久久黄色av网站| 日韩电影大全免费观看2023年上| 国产91精品不卡视频| 91精品免费视频| 色阁综合伊人av| 91夜夜未满十八勿入爽爽影院| 97热精品视频官网| 日韩高清中文字幕| 97国产一区二区精品久久呦| www.亚洲一区| 美女久久久久久久| 亚洲天堂成人在线| 国产午夜精品全部视频在线播放| 国产成人一区二区在线| 欧美成人国产va精品日本一级| 亚洲天堂网在线观看| 欧美猛交免费看| 亚洲国产婷婷香蕉久久久久久| 九九视频直播综合网| 日韩在线视频观看正片免费网站| 国产精品久久久久久久久久尿| 国模吧一区二区| 91精品久久久久久久久久久久久| 国产香蕉一区二区三区在线视频| 中文字幕国产精品| 成人精品视频在线| 亚洲第一级黄色片| 精品国产一区久久久| 国产欧美一区二区三区在线看| 欧美激情精品久久久久久黑人| 国产精品亚洲一区二区三区| 亚洲精品永久免费精品| 国产精品久久久久久久久久三级| 一区二区三区视频观看| 96国产粉嫩美女| 国产亚洲精品久久| 久久久午夜视频| 欧美大学生性色视频| 欧美精品videosex性欧美| 国产精品第一视频| 成人动漫网站在线观看| 欧美又大粗又爽又黄大片视频| 午夜精品一区二区三区视频免费看| 亚洲最大福利网| 亚洲国产日韩一区| 久久综合伊人77777蜜臀| 国产视频精品va久久久久久| 中文字幕欧美日韩精品| 日韩成人在线电影网| 亚洲视频在线免费观看| 一区二区亚洲欧洲国产日韩| 国产成人在线一区| 欧美在线视频观看免费网站| 国产精品久久久久999| 高清欧美一区二区三区| 久久不射热爱视频精品| 国产欧美一区二区三区久久人妖| 久久国产精品久久精品| 国产免费一区二区三区香蕉精| www.xxxx精品| 午夜美女久久久久爽久久| 欧美日韩一区二区免费视频| 亚洲影院在线看| 久久综合免费视频影院| 色妞在线综合亚洲欧美| 91久久国产精品91久久性色| 91tv亚洲精品香蕉国产一区7ujn| 亚洲天堂av在线播放| 亚洲资源在线看| 精品视频中文字幕| 欧美有码在线视频| 亚洲精品一区中文字幕乱码| 欧美肥婆姓交大片| 国产精品激情av在线播放| 亚洲男人天堂网| 国产日韩欧美一二三区| 人妖精品videosex性欧美| 亚洲精品v欧美精品v日韩精品| 亚洲人成毛片在线播放| 久久久精品影院| 日韩av中文字幕在线免费观看| 一本色道久久88综合亚洲精品ⅰ| 综合网中文字幕| 成人久久久久爱| 亚洲人成伊人成综合网久久久| 欧美在线视频一二三| 清纯唯美日韩制服另类| 91精品国产91久久久久| 精品国产91久久久久久老师| 91av视频在线观看| 久久综合国产精品台湾中文娱乐网| 97精品在线观看| 色中色综合影院手机版在线观看| 影音先锋欧美在线资源| 国产精品免费看久久久香蕉| 欧美日韩国产页| 久久中文字幕在线| 亚洲3p在线观看| 91国产高清在线| 国产日韩在线视频| 日韩视频在线观看免费| 国产一区二区三区毛片| 国产欧美精品日韩精品| 久久精品色欧美aⅴ一区二区| 亚洲成人久久一区| 欧美巨猛xxxx猛交黑人97人| 美日韩精品视频免费看| 91黑丝高跟在线| 国产精品自产拍在线观看| 国产精品欧美在线| 亚洲变态欧美另类捆绑| 91久久国产精品91久久性色| 国内外成人免费激情在线视频网站| 久久影院资源网| 国产国产精品人在线视| 欧美夜福利tv在线| 午夜精品久久久久久99热| 国产精品稀缺呦系列在线| 欧美激情视频一区| 成人黄色免费片| 欧美成人一二三| 亚洲午夜色婷婷在线| 亚洲福利在线视频| 日本道色综合久久影院| 三级精品视频久久久久| 日韩电影中文字幕一区| 不用播放器成人网| 国产欧美精品日韩| 永久555www成人免费|