流程
创建一个 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 是在模块里面找。
```javascript
const 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 />![image.png](https://cdn.nlark.com/yuque/0/2021/png/21429065/1625325795885-21532acc-b93b-4121-a70c-9c7a6ee108c9.png#clientId=u868f99e8-75c5-4&from=paste&height=68&id=u2919865a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=83&originWidth=243&originalType=binary&ratio=1&size=3612&status=done&style=none&taskId=ue8b4c6d1-2103-4a85-85b1-e477f8ef819&width=198.5)
"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 // 安装