前端架构之路-组件化

谁践踏了优雅 2022-05-21 01:20 291阅读 0赞

组件化

1. 什么是 “组件化”

组件化就是将项目中可以共用的代码提取出来,单独成一个组件,以便在多个地方调用此组件,这样便可以做到只维护一份代码,而不需要每次更新都要改多个地方,而且还不能保证都一样。

组件化一般分为项目内的组件化和项目外的组件化。

2. 项目内组件化

项目内的组件化,就是一个项目中可以共用的代码提取出来,独立成组件,供项目其他地方调用。比如像上一节推荐使用的目录结构中的 component 目录:

  1. |-- project/ 工程目录
  2. |-- src/ 源代码目录
  3. |-- component/ 全局组件目录
  4. |-- util/ 全局工具函数目录
  5. |-- ...

项目内的组件化对于单个项目是很适用,但当组件需要被跨项目使用(多个项目同时使用)时,便有些棘手了。

3. 彻底组件化

彻底组件化就是将组件独立成一个项目,如果需要在其他项目使用这个组件,就需要依赖这个项目。这个时候,组件化一般都是搭配版本管理工具和版本管理系统一起使用。

比较常用的版本管理工具有 git、svn。

版本管理系统以 gitlab 为例进行说明。

3.1 目录结构示例

  1. |-- project1/ 项目1
  2. |-- package.json
  3. |-- .gitignore
  4. |-- README.md
  5. |-- lila.config.js
  6. |-- ...
  7. |-- project/ 工程目录
  8. |-- src/ 源代码目录
  9. |-- component/ 项目内组件目录
  10. |-- util/ 全局工具函数目录
  11. |-- ...
  12. |-- component1/ 组件1
  13. |-- package.json
  14. |-- .gitignore
  15. |-- README.md
  16. |-- webpack.config.js
  17. |-- src/ 源代码目录
  18. |-- ...
  19. |-- component2/ 组件2
  20. |-- package.json
  21. |-- .gitignore
  22. |-- README.md
  23. |-- webpack.config.js
  24. |-- src/ 源代码目录
  25. |-- ...

3.2 使用组件

project1 中安装 component1, component2 依赖。

  1. # package.json
  2. {
  3. "dependencies": {
  4. "component1": "git+http://yourGit.com/yourName/component1.git#0.0.1",
  5. "component2": "git+http://yourGit.com/yourName/component2.git#0.0.1"
  6. }
  7. }
  8. # code
  9. // commonjs
  10. const component1 = require('component1');
  11. // es6
  12. import component1 from 'component1';

一般来说,独立化组件要有 私有包命名前缀。

  1. # package.json
  2. {
  3. "dependencies": {
  4. "@yourCompany/component1": "git+http://yourGit.com/yourName/component1.git#0.0.1",
  5. "@yourCompany/component2": "git+http://yourGit.com/yourName/component2.git#0.0.1"
  6. }
  7. }
  8. # code
  9. // commonjs
  10. const component1 = require('@yourCompany/component1');
  11. // es6
  12. import component1 from '@yourCompany/component1';

独立化组件与私有 npm 仓库配合使用是最完美的,下一节 私有 npm 仓库 将会讲到。

  1. # npm
  2. $ npm config set registry http://your.company.npm.registry.com
  3. # package.json
  4. {
  5. "dependencies": {
  6. "@yourCompany/component1": "^0.0.1",
  7. "@yourCompany/component2": "^0.0.1"
  8. }
  9. }
  10. # code
  11. // commonjs
  12. const component1 = require('@yourCompany/component1');
  13. // es6
  14. import component1 from '@yourCompany/component1';

4. 使用构建工具

团队开发组件化之后,就会有大量的组件产生。与诸多项目一样,如何既能快速开发,又有规范可循,维护成本最小化,当然还是得用构建工具呀。

以 yume 构建工具为例进行说明。

4.1 安装工具

  1. npm install yume -g

4.2 新建项目

  1. yume new yume-demo && cd yume-demo && npm install yume --save-dev

4.3 根据需要更新配置文件

配置文件在项目根目录下 yume.config.js 中。

  1. module.exports = {
  2. // 模块定义
  3. modules: {
  4. index: {
  5. js: 'src/index.js',
  6. filename: 'demo',
  7. library: 'Demo',
  8. libraryTarget: "umd"
  9. },
  10. ui: {
  11. html: 'ui/index.html',
  12. js: 'ui/index.js'
  13. },
  14. demo: {
  15. html: 'demo/index.html',
  16. js: 'demo/index.js'
  17. },
  18. example: {
  19. html: 'example/index.html',
  20. js: 'example/index.js'
  21. }
  22. },
  23. // 外部依赖包(不需要被打包进 dist 文件中)
  24. externals: {
  25. jquery: {
  26. commonjs: 'jquery',
  27. amd: 'jquery',
  28. commonjs2: 'jquery',
  29. root: 'jQuery'
  30. },
  31. ...
  32. },
  33. // 单独打包 css
  34. packCssSeparately: true,
  35. ...
  36. };

4.4 开发项目

  1. yume dev moduleName

4.5 打包项目

  1. yume dist moduleName

这个时候,会在 dist 目录中生成相应的包文件,然后运行 npm publish 就可以发布到远程仓库中了。

5. 动态开发组件

组件开发中有一个比较突出的问题,就是很多组件往往是与实际项目有强依赖性,需要与实际项目进行实时调试,而实际项目又是以版本化在管理组件,不能做到实时更新组件代码,组件必须发布一个版本,实际项目才能更新,这极大的降低了开发效率和便利性。

解决这个问题当然还是需要构建工具的支持。以 lila 与 yume 为例进行说明:

目录结构是这样的

  1. |-- projects/
  2. |-- project1/ 项目1
  3. |-- project2/ 项目2
  4. |-- component1/ 组件1
  5. |-- component2/ 组件2

project1 中代码是这样的

  1. # package.json { "dependencies": { "@yourCompany/component1": "^0.0.1" } } # code require('@yourCompany/component1/dist/component1.css'); // css 文件 const component1 = require('@yourCompany/component1'); // 主文件

配置 lila.config.js,让项目支持动态加载 @yourCompany/component1 的开发代码

  1. module.exports = {
  2. ...,
  3. // 添加一个 `resolve.modules`(添加一个 webpack 加载包基地址)
  4. resolveModules: [
  5. '../'
  6. ],
  7. // 别名配置(只有当命令行中有 `-o|out` 参数时才生效)
  8. outResolveAlias: {
  9. '@yourCompany/component1/dist/component1.css': 'component1/dist/component1.css',
  10. '@yourCompany/component1': 'component1/dist/component1.js'
  11. }
  12. }

dev, dist @yourCompany/component1 组件的本地开发代码

运行 dev, dist, sync 命令时加上 -o, --out 参数,就可以加载 @yourCompany/component1 组件的本地开发代码

  1. # dev
  2. $ lila dev moduleName -o
  3. # 正常运行,加载 0.0.1 版本中的代码
  4. $ lila dev moduleName
  5. # dist
  6. $ lila dist moduleName -e 1 -out
  7. # sync
  8. $ lila sync moduleName -e 2 --out

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 前端组件思想

    1.开篇   先说说为什么要写这篇文章吧:不知从什么时候开始,大家相信前端摩尔定律:“每18个月,前端难度会增加一倍”。我并不完全认可这个数字的可靠性,但是这句话的本意我

    相关 前端架构-组件

    组件化 1. 什么是 “组件化” 组件化就是将项目中可以共用的代码提取出来,单独成一个组件,以便在多个地方调用此组件,这样便可以做到只维护一份代码,而不需要每次更新

    相关 前端组件是个撒?

    在了解模块化、组件化之前,最好先了解一下什么是高内聚,低耦合。它能更好的帮助你理解模块化、组件化。 高内聚,低耦合 高内聚,低耦合是软件工程中的概念,它是判断代码好坏的