工程化考虑因素

  1. PC还是移动端
    1. 移动端 spa
      1. ssr
    2. pc端 mpa
    3. 兼容的浏览器和版本
  2. 多人参与还是单人
    1. 多人合作
      1. 代码规范,Eslint + prettier
      2. 提交规范,commit规范,ci/cd
  3. 技术栈
    1. vue
    2. react
    3. 样式处理器
      1. less
      2. sass
    4. 语法
      1. ts
      2. es6+
    5. 模板引擎
      1. ejs
      2. pug
    6. 是否要支持第三方字体
  4. 工具类
    1. 安装依赖包,切换国内源
    2. 配置.npmrc 设置npm默认的项目源
  5. 测试
    1. 单元测试
    2. 集成测试
    3. e2e测试

webpack配置

  1. // webpack.config.js
  2. const path = require('path')
  3. const miniCssExtractPlugin = require('mini-css-extract-plugin')
  4. const htmlWebpackPlugin = require('html-webpack-plugin')
  5. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  6. module.exports = {
  7. mode: 'development',
  8. entry: './src/index.js',
  9. // entry: {
  10. // index: './src/index.js',
  11. // login: './src/login.js'
  12. // },
  13. output: {
  14. path: path.resolve(__dirname, './dist'),
  15. filename: '[name]-[chunkhash:7].js'
  16. },
  17. module: {
  18. rules: [
  19. {
  20. test: /\.css$/,
  21. use: ['style-loader', 'css-loader']
  22. },
  23. {
  24. test: /\.less$/,
  25. use: [
  26. // miniCssExtractPlugin.loader,
  27. // 'css-loader',
  28. // 'postcss-loader',
  29. // 'less-loader'
  30. 'kkb-style-loader',
  31. 'kkb-css-loader',
  32. 'kkb-less-loader',
  33. ]
  34. },
  35. {
  36. test: /\.js$/,
  37. use: [
  38. 'replace-loader',
  39. {
  40. loader: 'replace-loader-async',
  41. options: {
  42. name: '赵日天'
  43. }
  44. }
  45. ]
  46. }
  47. ]
  48. },
  49. resolveLoader: {
  50. modules: ['node_modules', './myLoaders']
  51. },
  52. plugins: [
  53. new htmlWebpackPlugin({
  54. template: './src/index.html',
  55. filename: 'index.html',
  56. // chunks: ['index'],
  57. }),
  58. // new htmlWebpackPlugin({
  59. // template: './src/index.html',
  60. // filename: 'login.html',
  61. // chunks: ['login'],
  62. // }),
  63. new CleanWebpackPlugin(),
  64. // new miniCssExtractPlugin({
  65. // filename: 'css/[name]-[chunkhash:7].css',
  66. // })
  67. ]
  68. }
  69. // myLoaders/replace-loader,
  70. module.exports = function (source) {
  71. const result = source.replace("hello", '哇塞')
  72. return result;
  73. }
  74. // myLoaders/replace-loader-async
  75. module.exports = function (source) {
  76. const callback = this.async()
  77. setTimeout(() => {
  78. const result = source.replace("老王", this.query.name)
  79. callback(null, result);
  80. }, 1000)
  81. }
  82. // myLoaders/kkb-style-loader
  83. module.exports = function (source) {
  84. return `const e = document.createElement('style')
  85. e.innerHTML = ${source}
  86. document.head.appendChild(e)
  87. `
  88. }
  89. // myLoaders/kkb-less-loader
  90. const less = require('less')
  91. module.exports = function (source) {
  92. less.render(source, (e, output) => {
  93. this.callback(e, output.css)
  94. })
  95. }
  96. // myLoaders/kkb-css-loader
  97. module.exports = function (source) {
  98. return JSON.stringify(source)
  99. }