一: 前端工程化的价值

工程化不等于工具,它是为解决问题而提出的技术方案,工程化的核心是整体项目的规划或者架构,工具只是落地或者实现的手段.

  1. 传统语言或语法的弊端.
  2. 无法使用模块化,组件化.
  3. 重复的机械式工作.
  4. 依赖后端服务的支持.
  5. 代码风格统一,质量保证.

二: 使用Gulp完成项目的自动化构建

Gulp自动化构建包目录:
|-jrg-pages ————————————包文件夹
|-bin ——————————————包的入口文件夹
|-jrg-pages.js
|-lib ——————————————-自动化构建入口文件夹
|-index.js
|-package.json
|-yarn.lock
|-.gitignore

  1. // 自动化构建目录 lib/index.js 代码
  2. // 引入gulp相关模块
  3. const {
  4. src,
  5. dest,
  6. parallel,
  7. series,
  8. watch
  9. } = require("gulp");
  10. // 统一管理gulp插件
  11. const loadPlugins = require("gulp-load-plugins");
  12. const plugins = loadPlugins();
  13. // 热更新
  14. const browseSync = require("browser-sync");
  15. const bs = browseSync.create();
  16. const del = require("del");
  17. // 获取命令行当前目录
  18. const cwd = process.cwd();
  19. /**
  20. * 常用插件:
  21. * gulp-sass
  22. * gulp-babel @babel/core @babel/preset-env
  23. * gulp-swig
  24. * gulp-imagemin
  25. * del
  26. * gulp-load-plugins
  27. * browser-sync
  28. * gulp-useref
  29. * gulp-htmlmin // 压缩html
  30. * gulp-uglify // 压缩js
  31. * gulp-if
  32. * gulp-clean-css // 压缩css
  33. */
  34. // 默认配置文件
  35. let config = {
  36. build: {
  37. src: "src",
  38. dist: "dist",
  39. templates: "templates",
  40. public: "public",
  41. paths: {
  42. styles: "assets/styles/*.scss",
  43. scripts: "assets/scripts/*.js",
  44. pages: "*.html",
  45. images: "assets/images/**",
  46. fonts: "assets/fonts/**"
  47. }
  48. }
  49. }
  50. try {
  51. const loadConfig = require(`${cwd}/pages.config.js`);
  52. config = Object.assign({}, config, loadConfig);
  53. } catch (error) {
  54. console.log(error)
  55. }
  56. // 结构默认配置文件
  57. const { build } = config;
  58. const {
  59. paths,
  60. dist,
  61. templates,
  62. public
  63. } = build;
  64. const { styles, scripts, pages, images, fonts } = paths;
  65. // 样式处理 任务
  66. const style = () => {
  67. return src(
  68. styles,
  69. {
  70. sourcemaps: true,
  71. base: build.src,
  72. cwd: build.src
  73. })
  74. .pipe(plugins.sass({ outputStyle:"expanded" }))
  75. .pipe(dest(templates))
  76. .pipe(bs.reload({ stream: true }))
  77. }
  78. // js处理 任务
  79. const script = () => {
  80. return src(scripts, { base: build.src, cwd: build.src })
  81. .pipe(plugins.babel({ presets: [require("@babel/preset-env")] }))
  82. .pipe(dest(templates))
  83. .pipe(bs.reload({ stream: true }))
  84. }
  85. // html文件处理 任务
  86. const page = () => {
  87. return src(pages, { base: build.src, cwd: build.src })
  88. .pipe(plugins.swig({ data: config.data, defaults: { cache: false } }))
  89. .pipe(dest(templates))
  90. .pipe(bs.reload({ stream: true }))
  91. }
  92. // image, font, build下的文件,直接拷贝到dist目录,不用temp作为中转 任务
  93. const image = () => {
  94. return src(images, { base: build.src, cwd: build.src })
  95. .pipe(plugins.imagemin())
  96. .pipe(dest(dist))
  97. }
  98. // 字体文件处理 任务
  99. const font = () => {
  100. return src(fonts, { base: build.src, cwd: build.src })
  101. .pipe(plugins.imagemin())
  102. .pipe(dest(dist))
  103. }
  104. // public下的文件直接拷贝过去
  105. const extra = () => {
  106. return src(
  107. "**",
  108. {
  109. base: public,
  110. cwd: public
  111. })
  112. .pipe(dest(dist))
  113. }
  114. // 清除任务
  115. const clean = () => {
  116. return del([dist, templates]);
  117. }
  118. // 压缩处理任务
  119. const useref = () => {
  120. return src(
  121. pages,
  122. {
  123. base: templates,
  124. cwd: templates
  125. })
  126. .pipe(plugins.useref({ searchPath: [templates, "."] }))
  127. // 压缩处理js, html, css
  128. .pipe(plugins.if(/\.js$/, plugins.uglify()))
  129. .pipe(plugins.if(/\.css$/, plugins.cleanCss()))
  130. .pipe(plugins.if(/\.html$/, plugins.htmlmin({
  131. collapseWhitespace: true,
  132. minifyCSS: true,
  133. minifyJS: true
  134. })))
  135. .pipe(dest(dist))
  136. }
  137. // 热更新任务
  138. const serve = () => {
  139. // 监听文件的变化, 两个参数,第一个参数是文件路径,第二个参数处理任务的函数
  140. watch(styles,{ cwd: build.src }, style)
  141. watch(scripts, { cwd: build.src }, script)
  142. watch(pages,{ cwd: build.src }, page)
  143. watch([
  144. images,
  145. fonts
  146. ], { cwd: build.src }, bs.reload)
  147. watch("**",{ cwd: public }, bs.reload)
  148. bs.init({
  149. notify: false,
  150. port: 8888,
  151. server: {
  152. baseDir: [templates, dist, public],
  153. routes: {
  154. "/node_modules": "node_modules"
  155. }
  156. }
  157. })
  158. }
  159. // 编译任务
  160. const compile = parallel(style, script, page);
  161. // builds任务
  162. const builds = series(
  163. clean,
  164. parallel(
  165. series(compile, useref),
  166. image,
  167. font,
  168. extra
  169. )
  170. );
  171. // 本地开发任务
  172. const dev = series(compile, serve)
  173. module.exports = {
  174. clean,
  175. builds,
  176. dev,
  177. }
  1. // bin/jrg-pages.js 文件代码
  2. #!/usr/bin/env node
  3. process.argv.push("--cwd");
  4. process.argv.push(process.cwd());
  5. process.argv.push("--gulpfile");
  6. process.argv.push(require.resolve(".."));
  7. require("gulp/bin/gulp");
  1. // package.json 说明
  2. // 1: 插件都放入dependencies依赖中
  3. // 2: 增加: "files": [ "lib", "bin" ],
  4. // 3: 增加: "bin": "bin/jrg-pages.js",
  5. // 4: 增加: "main": "lib/index.js",