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

首頁 > 課堂 > 小程序 > 正文

gulp構建小程序的方法步驟

2020-03-21 15:54:44
字體:
來源:轉載
供稿:網友

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

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

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

 ts => jssass=>wxsswxml=>wxmljson=>json

由于我司小程序基礎庫是1.9.8的,不支持構建npm,所以node_modules的依賴包以及依賴路徑需要自己處理,于是寫了一個babel插件 babel-plugin-copy-npm。
這么一想,其實不難,而且單文件編譯,那不是gulp的強項嗎?。?!

最終效果:

gulp,小程序

gulp,小程序

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;

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日韩精品| 欧美乱大交做爰xxxⅹ性3| 久久久亚洲国产天美传媒修理工| 欧美壮男野外gaytube| 国产精品高潮呻吟久久av黑人| 国产精品网红直播| 欧美日韩福利在线观看| 97视频人免费观看| 欧美高跟鞋交xxxxhd| 国产精品精品视频一区二区三区| 国产精品美乳在线观看| 亚洲国产精品电影在线观看| 国产丝袜一区视频在线观看| 欧美性做爰毛片| 成人网在线免费看| 在线亚洲午夜片av大片| 欧美激情中文字幕乱码免费| 久久999免费视频| 91牛牛免费视频| 日韩av在线免费| 亚洲成人久久久久| 亚洲精品按摩视频| 欧美精品在线观看| 正在播放欧美一区| 91av网站在线播放| 狠狠爱在线视频一区| 久久香蕉国产线看观看网| 亚洲精品久久久久久久久久久久久| 亚洲国产中文字幕在线观看| 亚洲国产精品久久91精品| 国产精品亚洲激情| 成人黄色av网站| 欧美激情视频网址| 久久久欧美一区二区| 亚洲va久久久噜噜噜久久天堂| 最近日韩中文字幕中文| 国产这里只有精品| 成人a在线视频| 午夜精品久久久久久久白皮肤| 亚洲社区在线观看| 亚洲高清免费观看高清完整版| 在线播放国产一区二区三区| 亚洲理论片在线观看| 亚洲免费视频一区二区| 亚洲第一精品夜夜躁人人爽| 久色乳综合思思在线视频| 久久久国产精品x99av| 国产精品久久久久久久久久三级| 最新国产成人av网站网址麻豆| 欧美精品第一页在线播放| 国产一区二区三区直播精品电影| 这里只有精品视频| 亚洲免费视频在线观看| 少妇av一区二区三区| 久久艹在线视频| 日韩电影在线观看中文字幕| 97免费中文视频在线观看| 亚洲人成电影在线| 欧美日韩成人精品| 亚洲国产日韩欧美在线动漫| 77777少妇光屁股久久一区| 国产成人avxxxxx在线看| 热99在线视频| 日韩少妇与小伙激情| 中日韩美女免费视频网址在线观看| 日本不卡高字幕在线2019| 国模叶桐国产精品一区| 69久久夜色精品国产69乱青草| 欧美精品久久久久久久久久| 91免费高清视频| 欧日韩不卡在线视频| 亚洲最新视频在线| 国产成人福利夜色影视| 欧美日韩成人精品| 欧美激情精品久久久久久蜜臀| 成人av电影天堂| 欧美日韩国产在线播放| 91精品国产综合久久久久久蜜臀| 亚洲第一网站免费视频| 亚洲成人在线视频播放| 91免费在线视频网站| 日韩美女视频免费看| 色偷偷91综合久久噜噜| 日韩精品高清视频| 亚洲午夜小视频| 欧美精品videossex88| 国产成人一区二区| 欧美日产国产成人免费图片| 精品国产自在精品国产浪潮| 青青草原成人在线视频| 国产精品高潮呻吟久久av无限| 成人福利免费观看| 亚洲精品电影在线观看| 亚洲欧美三级伦理| 青青草精品毛片| 国产精品旅馆在线| 色与欲影视天天看综合网| 精品伊人久久97| 欧美重口另类videos人妖| 欧美电影免费观看网站| 亚洲一区av在线播放| 欧洲午夜精品久久久| 久久久精品美女| 欧美电影免费在线观看| 国产成人福利网站| 国产欧美精品一区二区三区介绍| 亚洲淫片在线视频| 欧美巨乳在线观看| 日韩精品免费在线| 亚洲毛茸茸少妇高潮呻吟| 国产黑人绿帽在线第一区| 北条麻妃一区二区三区中文字幕| 国产精品久久久久91| 不卡毛片在线看| 久久成人人人人精品欧| 中文字幕日韩欧美在线视频| 欧美人与物videos| 日韩中文字幕在线看| 国产69久久精品成人看| 国产精品久久久久久久一区探花| 欧美片一区二区三区| 亚洲图中文字幕| 亚洲欧美另类国产| 欧美高清理论片| 日韩网站免费观看高清| 日韩欧美中文免费| 另类专区欧美制服同性| 久久中文字幕在线视频| 欧美裸身视频免费观看| 国产日韩在线免费| 久久久亚洲国产天美传媒修理工| 91系列在线播放| 日韩中文字在线| 俺去了亚洲欧美日韩| 亚洲欧洲自拍偷拍| 91精品视频在线免费观看| 日韩av免费网站| 日韩中文字幕在线| 在线成人中文字幕| 日韩在线观看免费高清| 成人福利在线视频| 成人免费激情视频| 色在人av网站天堂精品| 精品毛片三在线观看| 欧美另类69精品久久久久9999| 亚洲一区二区三区xxx视频| 午夜精品视频网站| 国产亚洲精品久久久| 欧美电影免费观看大全| 亚洲男人第一网站| 在线观看日韩av| 欧美日在线观看| 日韩在线欧美在线国产在线| 亚洲色图17p| 亚洲国产古装精品网站| 亚洲天堂成人在线视频| 青青a在线精品免费观看| 精品久久久久久久久国产字幕| 日韩麻豆第一页| 国产不卡一区二区在线播放| 国产成人精品久久亚洲高清不卡| 91香蕉亚洲精品| 2018国产精品视频| 日本精品性网站在线观看|