webpack 打包时到底如何组织js

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

比如 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 前引入就可以了

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

时间: 2024-10-28 16:23:04

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

vue用webpack打包时引入es2015插件

1.安装依赖包 $ npm install --save-div babel-preset-es2015 ps:babel-loader.babel-core应该是默认装好的,如果没有安装,请重新安装 2.修改[webpack.config.js]配置文件找到 /\.js$/的rules,进行修改 { test: /\.js$/, use: [{ loader: 'babel-loader', options: { presets: ['es2015'] } }], exclude: /node

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

开发过程中我们不可避免的需要console.log调试,然而在上线时如果不删除这些console.log可能会造成内存泄漏,因为console.log出来的变量是不会被GC的,webpack给我们提供了一个非常棒的插件,看代码: new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false } }, sourceMap: config.build.productionSourceMap, parallel: true }) 原

Webpack打包时出现require报错问题

错误描述 通常问题常出现在target: 'node'环境中 编译文件中存在以如下方式使用require: // for example 1: const reload = require('require-reload')(requireFunc) // for example 2: function main () { var data = require(dataPath) } 打包时会报错: Critical dependency: require function is used in

使用webpack命令打包时,报错TypeError: Cannot read property 'presetToOptions' of undefined的解决办法

我只安装了webpack,没有安装webpack-cli,第一次输入webpack打包时,提示 One CLI for webpack must be installed. These are recommended choices, delivered as separate packages: - webpack-cli (https://github.com/webpack/webpack-cli) The original webpack full-featured CLI. We wi

Webpack打包构建太慢了?试试几个方法

Webpack是个很流行的打包工具,但其打包速度却一直被吐槽着 如果不用上一些打包的优化建议,单单打包两三个文件就能花上好几秒,放上几十个入口文件依赖几百上千个包的话,几分钟十几分钟妥妥的 本文整理了常见的一些方法,部分使用之后就看到了很大改善,部分没什么明显的变化,也可能是项目规模还不够大,先记录一下方法也好 一.使用监听模式或热更新热替换 webpack支持监听模式,此时需要重新编译时就可以进行增量构建,增量构建是很快的,基本不到一秒或几秒之内就能重新编译好 注意区分一下开发环境和线上环境,

webpack打包文件中的@符号表示什么意思

在看使用webpack打包的项目代码时,经常会看到在路径中引用@符号 import one from '@/views/one.vue' 那这里的@符号到底表示什么意思呢? 这其实利用了webpack的  resolve.alias  特性,webpabk.config.js  的配制代码如下,在webpack打包时,会把路径引用中的@符号,转换为相对应的路径. const path = require("path"); function resolve(dir) { return p

webpack打包css

1.第一种方式 1.安装css-loader和style-loader $ cnpm install css-loader style-loader --save-dev 2.引用的时候使用css-loader,让webpack可以打包css文件 require('css-loader!./style.css'); 3.打包 4.引入style-loader,将样式通过style标签写到head标签里 require('style-loader!css-loader!./style.css');

使用webpack打包的后,公共请求路径的配置问题

在我们公司,和后台接接口时,公共的请求路径我们是单独抽出来的,放在一个独立的public.js中,在public.js中存入那个公共变量 公共变量是这样 在其他地方使用ajax时,我们就这样使用 这种用法在平时的项目中是没有问题的.但是因为公司最近的项目都是用react来用,然后用webpack来打包. webpack打包后,public这个js也被打包进了每个组件中去.如果需要修改的话,要么就在react打包后的每个js文件中修改,要么就是在public.js中修改你的公共 路径,然后再打包一

node.js学习之webpack打包react最简单用法

研究一天多也没弄出来个毛,今天早上来到随便一试,嘿,结果成了.最简洁最简单的使用方法,记录下来. 首先,安装webpack命令: $ npm install webpack -g 全局安装,可以在cmd中使用webpack命令. 然后创建一个项目,项目名称webpack,我这里用的是webstorm11.创建成功之后cmd进入项目根目录,执行命令: $ npm init 这个命令会创建一个package.json的文件,是整个项目的配置文件,添加上webpack的依赖包: "devDepende