webpack按需加载

某些包比较大,比如echarts,但是用到的页面实际上并不多,所以不能打包到common里面去,想在跳转到某个页面的时候,按需加载,这个怎么处理。
web pack本身只提供了一个require.ensure

require.ensure(['echarts'], function() {
    var echarts = require('echarts');
    /* ... */
});

但是这个代码有点丑陋,而且,总不能我所有使用到echarts的页面都去写一遍吧。

请问有其他更优雅的方式吗?


现在工程里面就是js文件根据路由按需加载,然后每个使用echarts的页面都被打包进了一份echart。
但是首页等很多页面又没有使用这个,所以不想打包进common里面去;十几个用到echarts的页面每个页面包含一份,有重复。

阅读 12.1k
2 个回答

给你提供一个我目前实现按需加载的思路,使用async;此外可能webpack要2.x以上

export default class ReactEcharts extends React.Component {
    // ...
    componentDidMount = async () => {
        this.echartsInstance = await import("echarts");
        // ...
    }

    // update
    componentDidUpdate = async () => {
        this.echartsInstance = await import("echarts");;
        // ...
    }
    // ...
}

点这里

来自echarts官网
http://echarts.baidu.com/tuto...

按需引入 ECharts 图表和组件

默认使用 require('echarts') 得到的是已经加载了所有图表和组件的 ECharts 包,因此体积会比较大,如果在项目中对体积要求比较苛刻,也可以只按需引入需要的模块。

例如上面示例代码中只用到了柱状图,提示框和标题组件,因此在引入的时候也只需要引入这些模块,可以有效的将打包后的体积从 400 多 KB 减小到 170 多 KB。

// 引入 ECharts 主模块
var echarts = require('echarts/lib/echarts');
// 引入柱状图
require('echarts/lib/chart/bar');
// 引入提示框和标题组件
require('echarts/lib/component/tooltip');
require('echarts/lib/component/title');

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 绘制图表
myChart.setOption({
    title: { text: 'ECharts 入门示例' },
    tooltip: {},
    xAxis: {
        data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
    },
    yAxis: {},
    series: [{
        name: '销量',
        type: 'bar',
        data: [5, 20, 36, 10, 10, 20]
    }]
});

可以按需引入的模块列表见 https://github.com/ecomfe/ech...

对于另一个流行的模块打包工具 browserify 也是同样的用法,这里就不赘述了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏