问题一:引入前端库,方法也是不一样的

比如 lodash.js ,作为一个 chunk 用 html-webpack-plugin 打包到页面里,会生成一个全局变量 window._ ,在其它 js 中不必 require('lodash'); 就可以直接使用 window._

比如 webpack-zepto,作为一个 chunk 用 html-webpack-plugin 打包到页面里,不会生成 window.$ ,如果在其它 js 中直接使用 window.$ ,就会报错。需要在其它 js 中 var $ = require('webpack-zepto'); 这样 zepto 和页面 js 会打包到一个文件里,体积太大,而且不利于浏览器缓存

为了有效利用浏览器缓存,避免单个 js 体积太大,我们希望每个前端库打包成一个 js ,和页面逻辑分开

问题二:CommonsChunkPlugin

针对上一个问题,大家会提出使用 CommonsChunkPlugin ,参考这里

然而,使用 CommonsChunkPlugin 后,被指定的公共文件成了 js 的入口,其它 js 包括其它前端库都依赖这个 js ,如:

entry : {
'lodash' : ['lodash'],
'zepto' : ['webpack-zepto'],
}, plugins : [
new CommonsChunkPlugin({
names : ['zepto', 'lodash']
}),
...
]

打包后的 zepto.js

/******/ (function(modules) { // webpackBootstrap
/******/ // install a JSONP callback for chunk loading
/******/ var parentJsonpFunction = window["webpackJsonp"];
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {

打包后的 lodash.js

webpackJsonp([2],{

/***/ 0:
/***/ function(module, exports, __webpack_require__) {

那么必须指定 zepto.js 放在 lodash.js 的前面,不然就会报 webpackJsonp 未定义的错误!

然而原本 zepto 和 lodash 是没有相互依赖的关系的,能忍?

还有更不能妥协的场景,我要引入一个 jsA,它原本没有任何依赖,但它必须放在 head 里,因为它加载时会执行 document.write

打包时,我可以指定 jsA 放在 head 里,然而现在它依赖于 zepto 了,就必须把 zepto + jsA 放在 head 里

目前的解决方案:

不使用 CommonsChunkPlugin,每一个前端库,新建一个 js 专门 require 它,并生成一个全局变量,如:

lib/_zepto.js

window.$ = require("webpack-zepto");

然后作为一个 chunk 打包到页面中

这样解决了以上两个问题:

1. 每个前端库打包成一个独立 js,可以有效利用浏览器缓存,生成全局变量,页面 js 中可以直接使用

2. 不相互依赖的前端库位置随意,只要确保它们都在页面逻辑 js 前引入就可以了

抛砖引玉,请高手批评指正!谢谢!

webpack 打包时到底如何组织js的更多相关文章

  1. webpack打包时排除其中一个css、js文件,或单独打包一个css、js文件

    在项目中经常会需要将一些接口的配合文件或者某些样式文件,分离出来单独打包,便于后期改动,这里我以css文件为例,介绍实现两种方法: 项目目录: 如上图所示,现在我需要将项目中的scBtn.css文件单 ...

  2. js webpack打包时保留指定注释

    optimization: { minimizer: [ new TerserJSPlugin({ terserOptions: { format: { comments: /(\s*#if)|(\s ...

  3. vue用webpack打包时引入es2015插件

    1.安装依赖包 $ npm install --save-div babel-preset-es2015 ps:babel-loader.babel-core应该是默认装好的,如果没有安装,请重新安装 ...

  4. 使用vue+webpack打包时,去掉资源前缀

    在build文件夹下找到webpack.prod.conf.js文件,搜索 filename: utils.assetsPath('css/[name].[contenthash].css'), 将[ ...

  5. Webpack打包时警告 - Critical dependency: the request of a dependency is an expression

    关于解决 [Webpack] Critical dependency: the request of a dependency is an expression ------------------- ...

  6. 关于webpack,打包时遇到的错误

    最近在研究webpack这玩意,然后遇到一个问题,执行npm run build的时候,出现下面这个问题,各种搜索后,各种尝试,都没解决 运行时报错ERROR in ./src/app.vue Mod ...

  7. nodejs+react使用webpack打包时控制台报错

    一.错误:Uncaught ReferenceError: process is not defined 解决方法: new webpack.DefinePlugin({ 'process.env': ...

  8. 打包时ElementUI使vendor.js文件体量过大优化方法

    <h1> 1.在index.html中以CDN的方式引入 </h1> <p> 引入的时候注意:要先在引入之前引入VUE否则会报undedined prototype ...

  9. webpack打包时删除console.log,和debugger

    开发过程中我们不可避免的需要console.log调试,然而在上线时如果不删除这些console.log可能会造成内存泄漏,因为console.log出来的变量是不会被GC的,webpack给我们提供 ...

随机推荐

  1. NY 269 VF

    题目 求1—1000000000之间的数,它的各位数字之和为 s. dp[i][j]表示 i 位数,它的各位数之和为 j 的总个数. 这里假设第 i 位为 k,则前 i - 1 位的和应为 j - k ...

  2. C2第六次作业解题报告

    看过题解后如果觉得还算有用,请帮忙加点我所在团队博客访问量 http://www.cnblogs.com/newbe/ http://www.cnblogs.com/newbe/p/4069834.h ...

  3. 如何处理webView跳转

    - (void)webView:(UIWebView *)wv didFailLoadWithError:(NSError *)error {    // Give iOS a chance to o ...

  4. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  5. Android相关sdk使用

      SimpleDateFormat使用详解 Android_AlertDialog 两分钟彻底让你明白Android Activity生命周期(图文)! Android布局控件之LinearLayo ...

  6. NBIbatis 基础框架

    基础框架 NBIbatis 为真实在用的系统中剥离出的一个ibatis.net应用框架,目的在于通过此项目让软件工程师集中关注表现层及业务规则编写. 通过数据访问和业务规则可快速搭建不同表现形式的网站 ...

  7. 深入探索AngularJS(持续更新)

    数据双向绑定并不是Angular最出彩的地方.大部分对AngularJs的介绍都偏重于使用,使用的学习只是学了AngularJs的API,而那只能AngularJs的很小一部分.随着使用越来越深,系统 ...

  8. XML相关知识全接触(一)

    XML文件格式已经出来很久了.他的风头如今在JSON.YAML等新兴文件格式的冲击下已经显的不那么强劲.但是XML仍然是当今世界上使用最广泛的文件格式.围绕着它也有一大堆的概念和知识点.所以我们还是很 ...

  9. [BTS] Correct the specified Action, or refer to the documentation on the allowed formats for the Actions

    A message sent to adapter "WCF-SAP" on send port "CNILG.iHouse.SAP.WCFSAP" with ...

  10. error at ::0 can't find referenced pointcut解决办法(转载)

    原文:http://blog.sina.com.cn/s/blog_9ecb0d9d0101fheg.html Spring中采用annotation的方式实现AOP代理,运行测试代码时抛出以下异常: ...