分析说明:通过 craco 来修改 webpack 配置,从而实现 CDN 优化

    craco.config.js

    1. // 添加自定义对于webpack的配置
    2. const path = require('path')
    3. const { whenProd, getPlugin, pluginByName } = require('@craco/craco')
    4. module.exports = {
    5. // webpack 配置
    6. webpack: {
    7. // 配置CDN
    8. configure: (webpackConfig) => {
    9. // webpackConfig自动注入的webpack配置对象
    10. // 可以在这个函数中对它进行详细的自定义配置
    11. // 只要最后return出去就行
    12. let cdn = {
    13. js: [],
    14. css: []
    15. }
    16. // 只有生产环境才配置
    17. whenProd(() => {
    18. // key:需要不参与打包的具体的包
    19. // value: cdn文件中 挂载于全局的变量名称 为了替换之前在开发环境下
    20. // 通过import 导入的 react / react-dom
    21. webpackConfig.externals = {
    22. react: 'React',
    23. 'react-dom': 'ReactDOM'
    24. }
    25. // 配置现成的cdn 资源数组 现在是公共为了测试
    26. // 实际开发的时候 用公司自己花钱买的cdn服务器
    27. cdn = {
    28. js: [
    29. 'https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js',
    30. 'https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js',
    31. ],
    32. css: []
    33. }
    34. })
    35. // 都是为了将来配置 htmlWebpackPlugin插件 将来在public/index.html注入
    36. // cdn资源数组时 准备好的一些现成的资源
    37. const { isFound, match } = getPlugin(
    38. webpackConfig,
    39. pluginByName('HtmlWebpackPlugin')
    40. )
    41. if (isFound) {
    42. // 找到了HtmlWebpackPlugin的插件
    43. match.userOptions.cdn = cdn
    44. }
    45. return webpackConfig
    46. }
    47. }
    48. }

    public/index.html

    1. <body>
    2. <div id="root"></div>
    3. <!-- 加载第三发包的 CDN 链接 -->
    4. <% htmlWebpackPlugin.options.cdn.js.forEach(cdnURL => { %>
    5. <script src="<%= cdnURL %>"></script>
    6. <% }) %>
    7. </body>