方法一:
文件目录
上代码
gulpfile.js
var gulp = require("gulp");
var config = require("./index.js");
var rename = require("gulp-rename");
var clean = require("gulp-clean");
var less = require("gulp-less");
const SOURCE_CODE_PATH = "./src";
//清除
gulp.task("clean", (done) => {
gulp.src("./dist").pipe(clean());
done();
});
//输出wxml
gulp.task("wxml", (done) => {
gulp.src("./src/**/*.wxml").pipe(gulp.dest(config.dist));
done();
});
//输出html
gulp.task("html", (done) => {
gulp
.src("./src/**/*.html")
.pipe(
rename(function (path) {
path.extname = ".wxml";
})
)
.pipe(gulp.dest(config.dist));
done();
});
//输出less
gulp.task("less", (done) => {
gulp
.src("./src/**/*.less")
.pipe(
less({
outputStyle: "compressed",
})
)
.pipe(
rename(function (path) {
path.extname = ".wxss";
})
)
.pipe(gulp.dest(config.dist));
done();
});
//输出wxss
gulp.task("wxss", (done) => {
gulp.src("./src/**/*.wxss").pipe(gulp.dest(config.dist));
done();
});
//输入wxml
gulp.task("json", (done) => {
gulp.src("./src/**/*.json").pipe(gulp.dest(config.dist));
done();
});
//输出js
gulp.task("js", (done) => {
gulp.src("./src/**/*.js").pipe(gulp.dest(config.dist));
done();
});
//输出image
gulp.task("image", (done) => {
gulp
.src("./src/**/*.{png,jpg,gif,ico}")
.pipe(gulp.dest(config.dist));
done();
});
//输出sjs
gulp.task("sjs", (done) => {
gulp.src("./src/**/*.sjs").pipe(gulp.dest(config.dist));
done();
});
// 监听
gulp.task("watch", (done) => {
gulp.watch(SOURCE_CODE_PATH + "/**/*.html", gulp.series("html"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.wxml", gulp.series("wxml"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.less", gulp.series("less"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.wxss", gulp.series("wxss"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.js", gulp.series("js"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.sjs", gulp.series("sjs"));
gulp.watch(SOURCE_CODE_PATH + "/**/*.{json,json5}", gulp.series("json"));
gulp.watch(
SOURCE_CODE_PATH + "/**/*.{png,jpg,jpeg,gif,ico,svg,webp}",
gulp.series("image")
);
done();
});
//dev任务 需要异步执行wxml,ascc,json,js,image任务
gulp.task(
"dev",
gulp.series(
"html",
"wxml",
"less",
"wxss",
"json",
"js",
"image",
"sjs",
"watch",
(done) => {
gulp
.src(config.dev)
.pipe(
rename(function (path) {
path.basename = "config";
})
)
.pipe(gulp.dest(config.dist));
done();
}
)
);
//test任务 需要异步执行wxml,ascc,json,js,image任务
gulp.task(
"test",
gulp.series(
"html",
"wxml",
"less",
"wxss",
"json",
"js",
"image",
"sjs",
"watch",
(done) => {
gulp
.src(config.test)
.pipe(
rename(function (path) {
path.basename = "config";
})
)
.pipe(gulp.dest(config.dist));
done();
}
)
);
//prod任务 需要异步执行wxml,ascc,json,js,image任务
gulp.task(
"prod",
gulp.series(
"html",
"wxml",
"wxss",
"less",
"json",
"js",
"image",
"sjs",
"watch",
(done) => {
gulp
.src(config.prod)
.pipe(
rename(function (path) {
path.basename = "config";
})
)
.pipe(gulp.dest(config.dist));
done();
}
)
);
//默认任务,监听所有文件的而变化,出了图片
gulp.task(
"default",
gulp.series(
"html",
"wxml",
"wxss",
"less",
"json",
"js",
"image",
"sjs",
function () {
gulp.watch("./src/**/*.html", (done) => {
gulp
.src("./src/**/*.html")
.pipe(
rename(function (path) {
path.extname = ".wxml";
})
)
.pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.wxml", (done) => {
gulp.src("./src/**/*.wxml").pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.less", (done) => {
gulp
.src("./src/**/*.less")
.pipe(
less({
outputStyle: "compressed",
})
)
.pipe(
rename(function (path) {
path.extname = ".wxss";
})
)
.pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.wxss", (done) => {
gulp.src("./src/**/*.wxss").pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.json", (done) => {
gulp.src("./src/**/*.json").pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.js", (done) => {
gulp.src("./src/**/*.js").pipe(gulp.dest(config.dist));
done();
});
gulp.watch("./src/**/*.sjs", (done) => {
gulp.src("./src/**/*.sjs").pipe(gulp.dest(config.dist));
done();
});
}
)
);
gulpfile.prod.js
// 生产配置项
const config = {
env: "test",
a:1
}
package.json
{
"dependencies": {
"clean": "^4.0.2",
"cross-env": "^7.0.3",
"gulp": "^4.0.0",
"gulp-clean": "^0.4.0",
"gulp-less": "^4.0.1",
"gulp-rename": "^1.4.0"
},
"name": "aaa",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"dev:dev": "cross-env NODE_ENV=dev gulp dev",
"dev:test": "cross-env NODE_ENV=test gulp test",
"dev:prod": "cross-env NODE_ENV=prod gulp prod",
"build:test": "cross-env NODE_ENV=test gulp build",
"build:prod": "cross-env NODE_ENV=prod gulp build",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": ""
},
"author": "",
"license": "ISC",
"description": ""
}
方法二(zfb):
文件目录:在根目录,src同级新建文件夹config,gulpfile.js
gulpfile.js
const {
src,
dest,
parallel,
series,
watch
} = require('gulp');
const loadPlugins = require('gulp-load-plugins');
const path = require('path');
const chalk = require('chalk');
const plugins = loadPlugins();
// gulp-cached 将构建过的文件,生成一个hash,缓存在内存中,只更新修改文件,而不再会一次性重新构建全部监控文件。
const CONFIG_PATH = './configs';
const SOURCE_CODE_PATH = './src';
const OUTPUT_PATH = './dist';
const ENV = process.env.NODE_ENV || 'prod';
const startTime = Date.now();
const clean = () => {
if (process.env.CLEAR_CACHE) {
// 手动清理cache缓存
plugins.cache.clearAll();
}
return src([
OUTPUT_PATH + '**/*', '!' + OUTPUT_PATH + '/.tea', '!' + OUTPUT_PATH + '/mini.project.json', '!' + OUTPUT_PATH + '/node_modules',
]).pipe(plugins.plumber()).pipe(plugins.clean());
};
// 清空dist
const env = () => {
return src(path.resolve(CONFIG_PATH, `./config.${ENV}.js`,)).pipe(plugins.rename(function(path) {
path.basename = 'config';
})).pipe(dest(SOURCE_CODE_PATH));
};
const html = () => {
return src([
SOURCE_CODE_PATH + '/**/*.{axml,html}', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('html-cached')).pipe(plugins.fileInclude({
prefix: '@@',
basepath: '@file',
})).pipe(plugins.rename(function(path) {
path.extname = '.axml';
})).pipe(dest(OUTPUT_PATH));
};
const style = () => {
return src([
SOURCE_CODE_PATH + '/**/*.{less,css,acss}', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('style-cached')).pipe(plugins.plumber()).pipe(plugins.styleAliases({
'@common': './miniapp/common',
})) // less会把@import打包进来,使用真实项目路径;js和axml不用,模拟器读取dist目录根路径即为dist
.pipe(plugins.less({
outputStyle: 'compressed',
})).pipe(plugins.autoprefixer({
cascade: false
})).pipe(plugins.base64({
extensions: ['svg', 'png', 'jpg', 'jpeg', 'webp'],
exclude: [/https?/],
maxImageSize: 8 * 1024, // bytes
debug: false,
})).pipe(plugins.rename(function(path) {
path.extname = '.acss';
})).pipe(dest(OUTPUT_PATH));
};
const js = () => {
return src([
SOURCE_CODE_PATH + '/**/*.js', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('js-cached')).pipe(plugins.cache(plugins.babel({
plugins: ['@babel/plugin-proposal-optional-chaining', '@babel/plugin-proposal-class-properties'],
}), {
name: 'js-cache',
})).pipe(dest(OUTPUT_PATH));
};
const sjs = () => {
return src([
SOURCE_CODE_PATH + '/**/*.sjs', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('sjs-cached')).pipe(dest(OUTPUT_PATH));
};
const json = () => {
return src([
SOURCE_CODE_PATH + '/**/*.{json,json5}', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('json-cached')).pipe(plugins.json5ToJson({
beautify: true, // default
})).pipe(dest(OUTPUT_PATH));
};
const image = () => {
return src([
SOURCE_CODE_PATH + '/**/*.{png,jpg,jpeg,gif,ico,svg,webp}', '!' + SOURCE_CODE_PATH + '/node_modules/**/*',
]).pipe(plugins.cached('image-cached')).pipe(dest(OUTPUT_PATH));
};
const startWatch = (cb) => {
cb();
watch(SOURCE_CODE_PATH + '/**/*.tmpl', html);
watch(SOURCE_CODE_PATH + '/**/*.{html,axml}', html);
watch(SOURCE_CODE_PATH + '/**/*.{less, acss, css}', style);
watch(SOURCE_CODE_PATH + '/**/*.js', js);
watch(SOURCE_CODE_PATH + '/**/*.sjs', sjs);
watch(SOURCE_CODE_PATH + '/**/*.{json,json5}', json);
watch(SOURCE_CODE_PATH + '/**/*.{png,jpg,jpeg,gif,ico,svg,webp}', image);
const endTime = Date.now();
console.log(chalk.blue('当前环境是:' + ENV));
console.log(chalk.green('编译用时' + (endTime - startTime) / 1000 + 's'));
console.log(chalk.yellow('监听中'));
};
const main = parallel(html, js, json, sjs, style, image);
const dev = series(env, main, startWatch, (cb) => {
cb();
});
const build = series(clean, env, main, (cb) => {
cb();
const endTime = Date.now();
console.log(chalk.blue('当前环境是:' + ENV));
console.log(chalk.green('编译完成,用时' + (endTime - startTime) / 1000 + 's'));
});
module.exports = {
dev,
build
};
packages.jaon
"scripts": {
"dev:dev": "cross-env NODE_ENV=dev gulp dev",
"dev:test": "cross-env NODE_ENV=test gulp dev",
"dev:prod": "cross-env NODE_ENV=prod gulp prod",
"build:test": "cross-env NODE_ENV=test gulp build",
"build:prod": "cross-env NODE_ENV=prod gulp build",
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
"gulp": "^4.0.0",
"gulp-autoprefixer": "^7.0.1",
"gulp-babel": "^8.0.0",
"gulp-base64": "^0.1.3",
"gulp-cache": "^1.1.3",
"gulp-cached": "^1.1.1",
"gulp-clean": "^0.4.0",
"gulp-file-include": "^2.3.0",
"gulp-json-editor": "^2.5.4",
"gulp-json5-to-json": "^0.2.1",
"gulp-less": "^4.0.1",
"gulp-load-plugins": "^2.0.8",
"gulp-plumber": "^1.2.1",
"gulp-rename": "^1.4.0",
"gulp-style-aliases": "^1.1.11"
}