问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

webpack到底有什么用

发布网友 发布时间:2022-04-20 04:42

我来回答

2个回答

懂视网 时间:2022-05-14 17:52

webpack是一个模块捆绑器,适用于最大的单页Web应用程序,可以与单独的任务运行器捆绑在一起,它可以处理JavaScript,CSS等。webpack是前端开发人员工具集的一个很好的补充,使用webpack,Web开发更快,更高效,更有趣。

什么是模块捆绑器?

在大多数编程语言中,我们可以将代码分成多个文件,并将这些文件导入到应用程序中,以使用其中包含的功能。这并不是内置在浏览器中的,因此构建模块捆绑器会将这种功能以多种形式提供:通过异步加载模块并在加载完成后运行它们;或者通过将所有必需的文件组合到一个JavaScript文件中,在通过HTML中的<script>标签加载。

如果没有模块加载器和捆绑器,我们也可以随时手动组合文件或将HTML加载到无数<script>标签中,但这有几个缺点:

1、我们需要跟踪文件应加载的正确顺序,包括哪些文件取决于哪些其他文件,并确保不包含不需要的任何文件。

2、多个<script>标签意味着多次调用服务器来加载所有代码,这对性能来说更糟糕。

3、需要大量的手动工作,而不是让计算机为你做这些工作。

为什么选择Webpack?

选择Webpack,有以下几个原因:

1、它相对新颖,因为它能够解决或避免其前辈中出现的缺点和问题。

2、入门很简单。如果我们只是想将一堆JavaScript文件捆绑在一起而没有任何其他花哨的东西,甚至不需要配置文件。

3、它的插件系统使它能够做得更多,使它非常强大。因此,它可能是我们需要的唯一构建工具。

Webpack的执行过程

Webpack从条目(entry)开始工作,通常这些是JavaScript模块,其中webpack开始其遍历过程。在此过程中,webpack会根据加载器配置评估条目(entry)匹配,这些配置告诉webpack如何转换每个匹配。

解析流程

条目(entry)本身就是一个模块。当webpack遇到一个条目时,webpack会尝试使用条目的resolve配置将条目与文件系统匹配。除了node_modules之外,我们还可以告诉webpack对特定目录执行查找。也可以调整webpack与文件扩展名匹配的方式,并且可以为目录定义特定的别名。该耗竭与包章涵盖了更详细的这些想法。

如果解析通过失败,webpack会引发运行时错误。如果webpack设法正确解析文件,webpack将根据加载器定义对匹配的文件执行处理。每个加载器对模块内容应用特定的转换。

可以通过多种方式配置加载程序与已解析文件匹配的方式,包括文件类型和文件系统中的位置。Webpack的灵活性甚至允许我们根据文件导入项目的位置对文件应用特定的转换。

对webpack的加载器执行相同的解析过程。Webpack允许我们在确定应使用哪个加载器时应用类似的逻辑。由于这个原因,装载程序已经解析了自己的配置。如果webpack无法执行加载程序查找,则会引发运行时错误。

总结:

热心网友 时间:2022-05-14 15:00

1. 为什么用 webpack?
他像 Browserify, 但是将你的应用打包为多个文件. 如果你的单页面应用有多个页面, 那么用户只从下载对应页面的代码. 当他么访问到另一个页面, 他们不需要重新下载通用的代码.
他在很多地方能替代 Grunt 跟 Gulp 因为他能够编译打包 CSS, 做 CSS 预处理, 编译 JS 方言, 打包图片, 还有其他一些.
它支持 AMD 跟 CommonJS, 以及其他一些模块系统, (Angular, ES6). 如果你不知道用什么, 就用 CommonJS.
2. Webpack 给 Browserify 的同学用
对应地:
browserify main.js > bundle.js

webpack main.js bundle.js

Webpack 比 Browserify 更强大, 你一般会用 webpack.config.js 来组织各个过程:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
}
};

这仅仅是 JavaScript, 可以随意添加要运行的代码.
3. 怎样启动 webpack
切换到有 webpack.config.js 的目录然后运行:
webpack 来执行一次开发的编译
webpack -p for building once for proction (minification)
webpack -p 来针对发布环境编译(压缩代码)
webpack --watch 来进行开发过程持续的增量编译(飞快地!)
webpack -d 来生成 SourceMaps
4. JavaScript 方言
Webpack 对应 Browsserify transform 和 RequireJS 插件的工具称为 loader. 下边是 Webpack 加载 CoffeeScript 和 * JSX-ES6 的配置(你需要 npm install jsx-loader coffee-loader):
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' } // loaders 可以接受 querystring 格式的参数
]
}
};

要开启后缀名的自动补全, 你需要设置 resolve.extensions 参数指明那些文件 Webpack 是要搜索的:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' }
]
},
resolve: {
// 现在可以写 require('file') 代替 require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
}
};

5. 样式表和图片
首先更新你的代码用 require() 加载静态资源(就像在 Node 里使用 require()):
require('./bootstrap.css');
require('./myapp.less');

var img = document.createElement('img');
img.src = require('./glyph.png');

当你引用 CSS(或者 LESS 吧), Webpack 会将 CSS 内联到 JavaScript 包当中, require() 会在页面当中插入一个 `<style>标签. 当你引入图片, Webpack 在包当中插入对应图片的 URL, 这个 URL 是由require()` 返回的.
你需要配置 Webpack(添加 loader):
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
path: './build', // 图片和 JS 会到这里来
publicPath: 'http://mycdn.com/', // 这个用来成成比如图片的 URL
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.less$/, loader: 'style-loader!css-loader!less-loader' }, // 用 ! 来连接多个人 loader
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} // 内联 base64 URLs, 限定 <=8k 的图片, 其他的用 URL
]
}
};

6. 功能开关
有些代码我们只想在开发环境使用(比如 log), 或者 dogfooging 的服务器里边(比如内部员工正在测试的功能). 在你的代码中, 引用全局变量吧:
if (__DEV__) {
console.warn('Extra logging');
}
// ...
if (__PRERELEASE__) {
showSecretFeature();
}

然后配置 Webpack 当中的对应全局变量:
// webpack.config.js

// definePlugin 接收字符串插入到代码当中, 所以你需要的话可以写上 JS 的字符串
var definePlugin = new webpack.DefinePlugin({
__DEV__: JSON.stringify(JSON.parse(process.env.BUILD_DEV || 'true')),
__PRERELEASE__: JSON.stringify(JSON.parse(process.env.BUILD_PRERELEASE || 'false'))
});

mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
plugins: [definePlugin]
};

然后你在控制台里用 BUILD_DEV=1 BUILD_PRERELEASE=1 webpack 编译. 注意一下因为 webpack -p 会执行 uglify dead-code elimination, 任何这种代码都会被剔除, 所以你不用担心秘密功能泄漏.
7. 多个进入点(entrypoints)
比如你用 profile 页面跟 feed 页面. 当用户访问 profile, 你不想让他们下载 feed 页面的代码. 因此你创建多个包: 每个页面一个 "main mole":
// webpack.config.js
mole.exports = {
entry: {
Profile: './profile.js',
Feed: './feed.js'
},
output: {
path: 'build',
filename: '[name].js' // 模版基于上边 entry 的 key
}
};

针对 profile, 在页面当中插入 <script src="build/Profile.js"></script>. feed 页面也是一样.
8. 优化共用代码
feed 页面跟 profile 页面共用不要代码(比如 React 还有通用的样式和 component). Webpack 可以分析出来他们有多少共用模块, 然后生成一个共享的包用于代码的缓存.
// webpack.config.js

var webpack = require('webpack');

var commonsPlugin =
new webpack.optimize.CommonsChunkPlugin('common.js');

mole.exports = {
entry: {
Profile: './profile.js',
Feed: './feed.js'
},
output: {
path: 'build',
filename: '[name].js'
},
plugins: [commonsPlugin]
};

在上一个步骤的 script 标签前面加上 <script src="build/common.js"></script> 你就能得到廉价的缓存了.
9. 异步加载
CommonJS 是同步的, 但是 Webpack 提供了异步指定依赖的方案. 这对于客户端的路由很有用, 你想要在每个页面都有路由, 但你又不像在真的用到功能之前就下载某个功能的代码.
声明你想要异步加载的那个"分界点". 比如:
if (window.location.pathname === '/feed') {
showLoadingState();
require.ensure([], function() { // 语法奇葩, 但是有用
hideLoadingState();
require('./feed').show(); // 函数调用后, 模块保证在同步请求下可用
});
} else if (window.location.pathname === '/profile') {
showLoadingState();
require.ensure([], function() {
hideLoadingState();
require('./profile').show();
});
}

Webpack 会完成其余的工作, 生成额外的 chunk 文件帮你加载好.
Webpack 在 HTML script 标签中加载他们时会假设这些文件是怎你的根路径下. 你可以用 output.publicPath 来配置.
// webpack.config.js
output: {
path: "/home/proj/public/assets", // path 指向 Webpack 编译能的资源位置
publicPath: "/assets/" // 引用你的文件时考虑使用的地址
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
香蕉酸奶什么时候吃对减肥效果好-香蕉酸奶几点吃最佳时间 是是什么词性 魔兽世界狂暴战选什么种族看起来霸气威武?LM和BL分别说下。牛头人... 表达喜怒哀乐的成语有哪些? 问:我跟我朋友都19岁了女生就,我们想一起外面住宿一起工作,但是她很听... 女孩子高中毕业就可以不征求大人随便在外过夜了吗 ...19岁的女学生,和男朋友住宾馆会不会被学校查到吗??宾馆和学校有关系... ...女生就不能去闺蜜那里过夜?我都已经19岁了我爸妈还管我 哑然失笑的近义词和反义词是什么_哑然失笑是什么意思? 在黄梓良那儿算了说正缘桃花在猪年会出现,现在都鼠年了还没出现是骗子... Webpack有哪些核心?分别都代表了什么? webpack到底怎么用 什么是WebPack,为什么要使用它 ps设计封面图制作成立体书籍效果扭曲在哪 PS如何用封面图片批量制作书籍效果图? 怎么用ps做小说封面 老师让我们用photoshop设计书籍封面,,我就只想问... 求教:用PS做书籍封面要打印的,做素材的图片分辨... 设计书本封面的步骤是什么 如何使用ps制作书的封面 怎么用ps做书的封面 微信显示该内容已不可见? 从朋友圈消息列表点进去别人之前发的朋友圈,显示该内容已不可见是什么意思?是删了还是锁了&#128274; 鸭肉火锅怎么做好吃又简单 鸭肉火锅 麻辣火锅鸭的做法 最正宗的做法 想知道正宗鸭肉火锅的做法 鸭肉火锅的做法,鸭肉火锅怎么做好吃,鸭肉火锅 鸭肉火锅的做法,鸭肉火锅怎么做好吃,鸭肉火锅的家常 鸭肉火锅的做法 webpack执行机制流程是怎么样的 为什么使用webpack webpack中是什么意思?有什么用?如何用 什么是web pack 为什么要用webpack 知乎 webpack 打包怎么优化的 如何写一个webpack插件 webpack问题。。。,。。。, 安装webpack后还是提示webpack不是内部命令 微信朋友圈内容不可见是删除了吗 excel如何计算绝对值 excel绝对值怎么算? Excel 如何在excel中设置绝对值公式 excel绝对值 EXCEL的绝对值符号怎么输入呢? excel表格中如何计算绝对值 excel绝对值怎么算 如何excel算绝对值 excel里绝对值函数 EXCEL中绝对值符号怎么打