流程
创建一个 node 模块,把 demo 中的 gulpfile 中的内容提取到模块的入口文件。把 demo 的开发依赖转移到模块的依赖。demo 中的 gulpfile 的内容改成:
module.exports = require('chen-pages')
通过 yarn link 和 yarn link “模块名”,把模块添加到 demo 的 node_modules。
由于模块尚未发布,这时 demo 运行 gulp 命令,会找不到 gulp ,需要暂时添加 gulp-cli 和 gulp 作为开发依赖。如果模块正式发布,则无需此步骤。
demo 中创建一个 pages.config.js 文件,作为约定的配置文件,把模块入口文件中的 data 项转移到里面。

- 在模块入口文件,原来的data项的位置,读取配置文件。原引用 data 项的地方改为 config.data。 ```javascript const cwd = process.cwd() let config = {}
try {
const loadConfig = require(${cwd}/pages.config.js)
config = Object.assign({}, config, loadConfig)
} catch (error) {
}
const page = () => { return src(‘src/*.html’, { base: ‘src’ }) .pipe(plugins.swig({ data: config.data, defaults: { cache: false } })) // 由原本的data改为data:config.data .pipe(dest(‘temp’)) .pipe(bs.reload({ stream: true })) }
6. script 任务中配置了 preset-env 的preset,旧的引入方式是在 demo 的 node_modules 下找,但现在 demo 中没有安装,应该修改成 require,require 是在模块里面找。```javascriptconst script = () => {return src('src/assets/scripts/*.js', { base: 'src' }).pipe(plugins.babel({ presets: ['@babel/preset-env'] })).pipe(dest('temp')).pipe(bs.reload({ stream: true }))}const script = () => {return src('src/assets/scripts/*.js', { base: 'src' }).pipe(plugins.babel({ presets: [require('@babel/preset-env')] })).pipe(dest('temp')).pipe(bs.reload({ stream: true }))}
- 至此,自动构建化工作流模块完成。
优化
抽象路径配置
把模块的入口文件中,写死的配置路径抽象到 config 对象中,这样可以实现在项目中自行修改路径。
let config = {build: {src: 'src',dist: 'dist',temp: 'temp',public: 'public',paths: {styles: 'assets/styles/*.scss',scripts: 'assets/scripts/*.js',pages: '*.html',images: 'assets/images/**',fonts: 'assets/fonts/**',}}}// 原本的代码const style = () => {return src('src/assets/styles/*.scss', { base: 'src' }).pipe(plugins.sass({ outputStyle: 'expanded' })).pipe(dest('temp')).pipe(bs.reload({ stream: true }))}// 抽象路径后代码const style = () => {return src(config.build.paths.styles, { base: config.build.src, cwd: config.build.src }) //cwd变量可以指定相对路径,这里效果等同于 src(config.build.src + config.build.paths.styles, { base: config.build.src }).pipe(plugins.sass({ outputStyle: 'expanded' })).pipe(dest(config.build.temp)).pipe(bs.reload({ stream: true }))}// 原本的代码const extra = () => {return src('public/**', { base: 'public' }).pipe(dest('dist'))}// 抽象路径后代码const extra = () => {return src('**', { base: config.build.public, cwd: config.build.public }).pipe(dest(config.build.dist))}// 原本的代码const serve = () => {watch('src/assets/styles/*.scss', style)watch('src/assets/scripts/*.js', script)watch('src/*.html', page)watch(['src/assets/images/**','src/assets/fonts/**','public/**',], bs.reload)bs.init({notify: false,// files: 'dist/**',port: 3080,// open: false,server: {baseDir: ['temp', 'src', 'public'],routes: {'/node_modules': 'node_modules'}}})}// 抽象路径后代码const serve = () => {watch(config.build.paths.styles, { cwd: config.build.src }, style)watch(config.build.paths.scripts, { cwd: config.build.src }, script)watch(config.build.paths.pages, { cwd: config.build.src }, page)watch([config.build.paths.images,config.build.paths.fonts,], { cwd: config.build.src }, bs.reload)watch('**', { cwd: config.build.public }, bs.reload)bs.init({notify: false,// files: 'dist/**',port: 3080,// open: false,server: {baseDir: [config.build.temp, config.build.src, config.build.public],routes: {'/node_modules': 'node_modules'}}})}
封装 Gulp-CLI
在之前的 demo 中,gulpfile 文件的作用就是引入模块提供的任务,显得比较冗余。可以通过在模块中添加 cli ,把 gulp 封装到模块中。在模块根目录添加 bin 目录,bin 目录下添加一个 cli 入口文件,在 package.json 中添加 bin 字段,bin 字段值就是入口文件。 <br />
"bin": "bin/chen-page.js",
cli 入口文件的内容:
#!/usr/bin/env node// 拼接命令行参数process.argv.push('--cwd') // 指定工作目录process.argv.push(process.cwd()) // 当前目录process.argv.push('--gulpfile') //指定 gulpfile 文件process.argv.push(require.resolve('..')) //这里可以写成 ../lib/index.js,简写成 .. 会去查找 package.json 中的 main 字段// console.log(process.argv);require('gulp/bin/gulp') // 执行 gulp 模块的 gulp 文件
发布并使用模块
yarn publish --registry https://registry.yarnpkg.com // 发布yarn add chen-pages --dev // 安装
