`

[译]webpack官网文档 :指南 -- 6.代码分割 - 第三方库

阅读更多

原创翻译,转载请注明出处。 

原文地址:https://webpack.js.org/guides/code-splitting/

 

一个典型的应用基于框架或者功能的需求,会依赖于许多第三方库。会使用这些库的特定版本,代码不会频繁变更。相对比,应用的代码会频繁变更。

连同第三方库的代码一起打包应用代码会非常低效。这是因为会基于缓存头部信息来缓存资源文件,并且缓存的文件如果内容没有变更,就不需要访问cdn。要想利用这个优点,我们希望不管应用代码如何变化,第三方库文件的哈希值保持不变。

只有我们把第三方库文件和应用代码分开打包才能实现。

让我们考虑一个使用momentjs的简单应用,一个通常用于时间格式化的库。

在你的应用文件夹上,像下面这样安装moment

npm install --save moment

index文件将会当作一个依赖来引入moment,并且像下面这样输出当前时间的日志

index.js

var moment =require('moment');
console.log(moment().format());

 

我们可以使用下面的配置,用webpack打包应用

Webpack.config.js

var path =require('path');
 
module.exports =function(env){
    return{
        entry:'./index.js',
        output:{
            filename:'[name].[chunkhash].js',
            path: path.resolve(__dirname,'dist')
        }
    }
}

 

在你的应用里运行webpack,如果你检查结果包,你将会看到momentindex.js被打包到bundle.js里。

 

多个入口

让我们为moment增加独立的入口点来避免这个结果,命名它为vendor

webpack.config.js

var path =require('path');
 
module.exports =function(env){
    return{
        entry:{
            main:'./index.js',
            vendor:'moment'
        },
        output:{
            filename:'[name].[chunkhash].js',
            path: path.resolve(__dirname,'dist')
        }
    }
}

 

现在运行webpack,我们看到生成了两个包。如果你已经检查过它们,你会发现moment代码出现在两个包文件里!原因时moment是主应用(例如:index.js)的依赖,并且每一个入口点都会打包他们的依赖。

正是这个原因,我们需要使用CommonsChunkPlugin

 

CommonsChunkPlugin

这是一个相当复杂的插件。它从根本上允许我们从不同的包里提取出共同模块,把它们加到共通包里。如果共通包不存在就做成一个新的。

我们可以像下面这样修改webpack配置文件:

webpack.config.js

var webpack =require('webpack');
var path =require('path');
 
module.exports =function(env){
    return{
        entry:{
            main:'./index.js',
            vendor:'moment'
        },
        output:{
            filename:'[name].[chunkhash].js',
            path: path.resolve(__dirname,'dist')
        },
        plugins:[
            newwebpack.optimize.CommonsChunkPlugin({
                name:'vendor'// Specify the common bundle's name.
            })
        ]
    }
}

 

现在在你的应用里运行webpack。查看包的内容会发现moment代码只存在与vendor包里。

 

默认的共通第三方库代码块

你可以配置CommonsChunkPlugin实例让他们只处理第三方库。

webpack.config.js

var webpack =require('webpack');
var path =require('path');
 
module.exports =function(){
    return{
        entry:{
            main:'./index.js'
        },
        output:{
            filename:'[name].[chunkhash].js',
            path: path.resolve(__dirname,'dist')
        },
        plugins:[
            newwebpack.optimize.CommonsChunkPlugin({
                name:'vendor',
                minChunks:function(module){
                   // this assumes your vendor imports exist in the node_modules directory
                   return module.context && module.context.indexOf('node_modules')!==-1;
                }
            })
        ]
    };
}

 

清单文件

但是如果我们修改应用代码,并重新运行webpack,我们发现三方库文件的哈希值变了。虽然我们做成了分开的vendormain包,我们看到应用代码变化的时候,vendor包也随着变化。这意味着我们仍然不能利用浏览器的缓存这个优点,应为vendor文件的哈希值会随着每次编译而变化,这样的话浏览器将不得不再次加载文件。

这个问题存在于每一次编译里,webpack生成一些webpack运行时代码,它帮助webpack完成它的工作。当只有一个包的时候,运行时代码就会存在于这个包里面。当有多个包生成的时候,运行时代码就会被提取到共通模块里,这里的vendor文件。

为了防止这个,我们需要把运行时代码提取到一个独立的清单文件里。虽然我们多生成了一个包,这个缺点将会被我们得到的vendor文件的长期缓存优点抵消。

webpack.config.js

var webpack =require('webpack');
var path =require('path');
 
module.exports =function(env){
    return{
        entry:{
            main:'./index.js',
            vendor:'moment'
        },
        output:{
            filename:'[name].[chunkhash].js',
            path: path.resolve(__dirname,'dist')
        },
        plugins:[
            newwebpack.optimize.CommonsChunkPlugin({
                names:['vendor','manifest']// Specify the common bundle's name.
            })
        ]
    }
};

 

通过上面的webpack配置,我们看到生成了3个包文件。vendor,mainmanifest包。

 

-- End --

分享到:
评论

相关推荐

    Webpack2 中文文档 pdf

    - **Libraries**:对于第三方库,可以使用 externals 配置选项来避免将它们打包进最终的文件中,从而减小文件体积。 - **使用 require.ensure**:这是一种旧的 API,现在已经被动态导入取代,但仍然可以在某些情况下...

    Demo-Web-App:这是一个演示网站,用于展示Typescript和webpack的React

    同时,项目还将体现如何集成第三方库,以完成特定任务,这展示了React生态系统中丰富的库选择和良好的扩展性。 **标签解析:** “JavaScript”标签表明了这个项目的基础语言环境。虽然项目主要使用了Typescript,...

    Vue.js 教程

    - **第三方库与插件**:Vue.js拥有丰富的第三方库和插件生态,可以帮助开发者快速实现特定功能。 通过以上内容的深入学习和实践,相信你能够全面掌握Vue.js的核心技术和应用场景,成为一名合格的Vue.js开发者。

    iceworks-toolkit:无忧的前端工具管理器

    6. **插件扩展**:iceworks-toolkit允许添加和管理第三方插件,扩展其功能,满足不同开发者或团队的个性化需求。 7. **跨平台支持**:iceworks-toolkit可在Windows、MacOS和Linux等主流操作系统上运行,确保开发者...

    alfinweblanjut.github.io

    7. **lib** 或 **vendor** 文件夹:可能包含第三方库和框架。 8. **.gitignore**:定义了在版本控制中忽略的文件和文件夹。 9. **LICENSE**:项目使用的开源许可协议。 在这个JavaScript项目中,开发者可能使用了...

    crystallum-client:水晶游戏客户端

    以及`node_modules`目录,包含项目依赖的第三方库。 2. **主文件**:项目启动点可能是`index.html`(HTML页面)和`index.js`(JavaScript主文件)。这些文件负责初始化游戏环境并加载其他模块。 3. **模块化**:...

    branchard.github.io

    7. **第三方库与框架**:Branchard可能使用了React、Vue.js、Angular等前端框架,或者用jQuery简化DOM操作,用Lodash处理实用函数。 8. **性能优化**:优化JavaScript代码,减少不必要的计算,使用模块打包工具(如...

    Green_Lab-Client:MC的客户

    5. **库和框架**:开发者可能会使用第三方的JavaScript库(如jQuery)或框架(如React、Vue.js或Angular)来加速开发和提高代码质量。 6. **配置文件**:用于设置项目环境、构建过程或依赖关系的配置。 7. **README...

    zaghouan

    常见的项目结构可能有src目录(存放源代码)、dist或build目录(编译后的可部署文件)、node_modules(依赖的第三方库)、package.json(项目配置和依赖管理)等。 2. 开发工具: JavaScript项目通常使用npm(Node ...

    kefedDataEditorApp

    5. **UI组件**:应用中可能包含自定义的UI组件,用于展示和编辑数据,这些组件可能是用框架原生或第三方库如Material-UI、Ant Design等构建的。 6. **版本控制**:项目使用Git进行版本控制,开发者通过提交、拉取和...

    Atomic-Pixels

    3. **第三方库**:JavaScript社区有许多成熟的图像处理库,如Papa Parse用于CSV解析,Three.js用于3D图形,Fabric.js用于Canvas对象管理,以及PixiJS这样的2D渲染引擎。如果"Atomic-Pixels"是一个库,那么它可能是...

    nnff_reimplementation:重新设计NNFF的官方网页

    5. **用户反馈**:通过JavaScript集成第三方服务,如 Disqus 或 Google Forms,收集用户对NNFF的反馈和建议。 为了实现这些功能,开发者可能会使用现代前端框架,如React或Vue.js,它们提供组件化开发模式,便于...

    ElevenNote

    5. 可能的第三方库:项目可能引入了一些JavaScript库,如用于音频处理的Tone.js,或者用于图形界面的D3.js,以提升开发效率和应用性能。 6. 模块化和打包:考虑到现代JavaScript开发的趋势,ElevenNote可能使用了...

Global site tag (gtag.js) - Google Analytics