cheers-mp-service
Version:
提供插件化的零配置小程序脚手架服务
58 lines (51 loc) • 2.09 kB
JavaScript
const gulp = require("gulp");
const gulpTs = require("gulp-typescript");
const gulpIf = require("gulp-if");
const gulpSourcemaps = require("gulp-sourcemaps");
const gulpAlias = require("gulp-ts-alias");
const gulpReplaces = require("gulp-replaces");
const resolveClientEnv = require("../../utils/resolveClientEnv");
const deepmerge = require("deepmerge");
const lazypipe = require("lazypipe");
const defaultOpt = {
srcDir: "src",
outputDir: "dist",
tsConfig: "",
};
function ts(opt, userOptions) {
opt = deepmerge(defaultOpt, opt);
const tsProject = gulpTs.createProject(opt.tsConfig, { moduleResolution: "Node" });
const isProd = process.env.NODE_ENV === "production";
const productionSourceMap = isProd && userOptions.productionSourceMap;
const jsCompressLazy = lazypipe().pipe(function () {
return gulpIf(isProd, require("gulp-terser")());
});
const sourcemapsInitLazy = lazypipe().pipe(gulpSourcemaps.init);
const sourcemapsWriteLazy = lazypipe().pipe(gulpSourcemaps.write);
function compileTS() {
const aliasConfig = JSON.parse(JSON.stringify(tsProject.config));
// 如果 alias 中包含 node_modules 的库,则过滤掉不处理,不然编译后它会指向 node_modules 目录而不是小程序自身的 miniprogram_npm 目录
const paths = aliasConfig.compilerOptions.paths;
if (paths) {
for (let [k, v] of Object.entries(paths)) {
if (/node_modules/.test(v)) {
delete paths[k];
}
}
}
// TODO 如果ts 的target 是es5,则开发模式下默认输出sourcemaps
const env = gulpReplaces(resolveClientEnv());
return gulp
.src(`${opt.srcDir}/**/*.ts`, { since: gulp.lastRun(compileTS) })
.pipe(gulpAlias({ configuration: aliasConfig }))
.pipe(gulpIf(productionSourceMap, sourcemapsInitLazy()))
.pipe(tsProject())
.pipe(env)
.pipe(jsCompressLazy())
.pipe(gulpIf(productionSourceMap, sourcemapsWriteLazy()))
.pipe(gulp.dest(opt.outputDir));
}
compileTS.displayName = "编译typescript";
return compileTS;
}
module.exports = ts;