原创翻译,转载请注明出处。
原文地址: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,如果你检查结果包,你将会看到moment和index.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,我们发现三方库文件的哈希值变了。虽然我们做成了分开的vendor和main包,我们看到应用代码变化的时候,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,main和manifest包。
-- End --
相关推荐
- **Libraries**:对于第三方库,可以使用 externals 配置选项来避免将它们打包进最终的文件中,从而减小文件体积。 - **使用 require.ensure**:这是一种旧的 API,现在已经被动态导入取代,但仍然可以在某些情况下...
同时,项目还将体现如何集成第三方库,以完成特定任务,这展示了React生态系统中丰富的库选择和良好的扩展性。 **标签解析:** “JavaScript”标签表明了这个项目的基础语言环境。虽然项目主要使用了Typescript,...
- **第三方库与插件**:Vue.js拥有丰富的第三方库和插件生态,可以帮助开发者快速实现特定功能。 通过以上内容的深入学习和实践,相信你能够全面掌握Vue.js的核心技术和应用场景,成为一名合格的Vue.js开发者。
6. **插件扩展**:iceworks-toolkit允许添加和管理第三方插件,扩展其功能,满足不同开发者或团队的个性化需求。 7. **跨平台支持**:iceworks-toolkit可在Windows、MacOS和Linux等主流操作系统上运行,确保开发者...
7. **lib** 或 **vendor** 文件夹:可能包含第三方库和框架。 8. **.gitignore**:定义了在版本控制中忽略的文件和文件夹。 9. **LICENSE**:项目使用的开源许可协议。 在这个JavaScript项目中,开发者可能使用了...
以及`node_modules`目录,包含项目依赖的第三方库。 2. **主文件**:项目启动点可能是`index.html`(HTML页面)和`index.js`(JavaScript主文件)。这些文件负责初始化游戏环境并加载其他模块。 3. **模块化**:...
7. **第三方库与框架**:Branchard可能使用了React、Vue.js、Angular等前端框架,或者用jQuery简化DOM操作,用Lodash处理实用函数。 8. **性能优化**:优化JavaScript代码,减少不必要的计算,使用模块打包工具(如...
5. **库和框架**:开发者可能会使用第三方的JavaScript库(如jQuery)或框架(如React、Vue.js或Angular)来加速开发和提高代码质量。 6. **配置文件**:用于设置项目环境、构建过程或依赖关系的配置。 7. **README...
常见的项目结构可能有src目录(存放源代码)、dist或build目录(编译后的可部署文件)、node_modules(依赖的第三方库)、package.json(项目配置和依赖管理)等。 2. 开发工具: JavaScript项目通常使用npm(Node ...
5. **UI组件**:应用中可能包含自定义的UI组件,用于展示和编辑数据,这些组件可能是用框架原生或第三方库如Material-UI、Ant Design等构建的。 6. **版本控制**:项目使用Git进行版本控制,开发者通过提交、拉取和...
3. **第三方库**:JavaScript社区有许多成熟的图像处理库,如Papa Parse用于CSV解析,Three.js用于3D图形,Fabric.js用于Canvas对象管理,以及PixiJS这样的2D渲染引擎。如果"Atomic-Pixels"是一个库,那么它可能是...
5. **用户反馈**:通过JavaScript集成第三方服务,如 Disqus 或 Google Forms,收集用户对NNFF的反馈和建议。 为了实现这些功能,开发者可能会使用现代前端框架,如React或Vue.js,它们提供组件化开发模式,便于...
5. 可能的第三方库:项目可能引入了一些JavaScript库,如用于音频处理的Tone.js,或者用于图形界面的D3.js,以提升开发效率和应用性能。 6. 模块化和打包:考虑到现代JavaScript开发的趋势,ElevenNote可能使用了...