成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

gulp構(gòu)建小程序

Mr_zhang / 1243人閱讀

摘要:目前來說,對于構(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

相關(guān)文章

  • 用 Electron 打造 Win/Mac 應(yīng)用,從「代碼」到可下載的「安裝包」,可能比你想得麻煩一

    摘要:三配置環(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)建你的代碼,但距離「真正地...

    LdhAndroid 評論0 收藏0
  • [Laya游戲開發(fā)]技巧使Laya構(gòu)建速度提高10倍

    摘要:為何選擇引擎微信小游戲推出之后,很多公司也相應(yīng)的進入到微信小游戲這個領(lǐng)域,現(xiàn)在市場上的游戲開發(fā)引擎,如都對小游戲有了很好的兼容性。 1. 為何選擇Laya引擎 微信小游戲推出之后,很多公司也相應(yīng)的進入到微信小游戲這個領(lǐng)域,現(xiàn)在市場上的游戲開發(fā)引擎,如Cocos、Egret、Laya都對小游戲有了很好的兼容性。目前公司技術(shù)棧主要是使用Cocos和Laya,經(jīng)過幾個項目的接觸,考量了引擎在...

    Harpsichord1207 評論0 收藏0
  • 從 JavaScript 到 TypeScript - 模塊化和構(gòu)建

    摘要:不過,相對于靜態(tài)類型檢查帶來的好處,這些代價是值得的。當(dāng)然少不了的模塊化標(biāo)準(zhǔn),雖然到目前為止和大部分瀏覽器都還不支持它。本身支持兩種模塊化方式,一種是對的模塊的微小擴展,另一種是在發(fā)布之前本身模仿的命名空間。有一種情況例外。 TypeScript 帶來的最大好處就是靜態(tài)類型檢查,所以在從 JavaScript 轉(zhuǎn)向 TypeScript 之前,一定要認(rèn)識到添加類型定義會帶來額外的工作量...

    Jonathan Shieber 評論0 收藏0
  • gulp構(gòu)建一個簡單常用的的環(huá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é)...

    Shimmer 評論0 收藏0
  • 前端相關(guān)匯總

    摘要:簡介前端發(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)...

    BenCHou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<