本篇是我通过一周多的时间阅读博客及官方文档所写的文章,算是本身对webpack学习的总结。有篇我的认为很是不错的webpack文章贴在最下面的参考连接的第一条。本篇介绍的是用webpack本身搭一个react应用javascript
`npm init` 自动帮你建立package.json文件 `npm install --save-dev webpack // 安装Webpack` 新建文件夹app、public文件分别用于存放源文件及打包后的存放文件。在app文件夹中建立index.js与index.html文件。再建立一个webpack的配置文件webpack.config.js。使用前记得安装下webpack `npm install webpack -g`,固然你也能够不全局安装。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>webpack</title> </head> <body> <script src="../public/bundle.js"></script> </body> </html>
const config = { entry: './app/index.js' }; module.exports = config;
entry就是指示 webpack 应该使用哪一个模块,来做为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。本项目中的入口文件就是app文件夹中的index.js文件。(多入口及更多选项参考官方文档)css
var config = { entry: "./app/index.js", // 入口文件 output:{ filename:"bundle.js", //filename 用于输出文件的文件名。 path:path.resolve(__dirname, './public'), //目标输出目录 path 的绝对路径。__dirname publicPath:path.resolve(__dirname, './public') //publicPath取决于你的网站根目录的位置,由于打包的文件都在网站根目录了,这些文件的引用都是基于该目录的。假设网站根目录为public,引用的图片路径是’./img.png’,若是publicPath为’/’,图片显示不了,由于图片都打包放在了dist中,那么你就要把publicPath设置为”/dist” } } module.exports = config;
填好入口与出口配置后、在命令行中输入.node_modules/.bin/webpack --config webpack.config.js
若是你是全局安装webpack的话可直接输入webpack --config webpack.config.js
,直接输入webpack
也能够,他会识别当前目录中的webpack.config.js。而后你就能够再public文件夹中看到名为bundle.js文件生成了。html
若是你不想每次在命令行中输入那么长的代码,那就在package.json中的scripts字段中配置以下前端
"scripts": { "build": "webpack --config webpack.config.js" }
无论你是否全局安装的webpack在scripts中他会自动识别node_modules中的webpack,因此不须要在里面输入./node_modules...
。如今你能够再命令行中输入npm run build
进行打包了。java
webpack-dev-server
是一个小型的Node.js Express服务器,webpack-dev-server默认会以当前目录为基本目录,除非你制定它.经过webpack-dev-server就可实现热加载了。使用前须要用npm安装npm install webpack-dev-server --save-dev
,它根据webpack.config.js文件中的选项构建。常见的选项以下:node
webpack-dev-server选项 | 选项说明 |
---|---|
content-Base | 默认状况下,webpack-dev-server会从项目的根目录提供文件,能够经过此选项设置文件的目录名 |
port | 服务器使用的端口,默认状况下为8080 |
inline | 设为true时能够在文件发生变化时,更新页面 |
colors | 设置终端输出字体颜色 |
historyApiFallback | 当设置为true时,访问全部服务器上不存在的文件,都会被重定向到/,也就是index.html文件 |
代码以下:react
var config = { entry: "./app/index.js", // 入口文件 output: { filename: "bundle.js", //filename 用于输出文件的文件名。 path: path.resolve(__dirname, './public') //目标输出目录 path 的绝对路径。__dirname }, devServer: { contentBase: "./public",//本地服务器所加载的页面所在的目录 historyApiFallback: true,//不跳转 inline: true,//实时刷新(为何这个我不加都能热更新???) port: 8888, // 想webpack-dev-server在端口8888启动 } }
webpack-dev-server默认会以当前目录为基本目录,由于我指定到了public,因此在public中新建个index.html,并在html中引入当前文件夹中的bundle.js。webpack
在package.json 添加以下代码就可快捷启动:web
"scripts": { "build": "webpack --config webpack.config.js", "server": "webpack-dev-server --config webpack.config.js" }
而后再命令行中输入npm run server
启动webpack-dev-server。并在浏览器打开http://localhost:8888/就能够查看了。修改了index.js中的代码,也会实时刷新了。正则表达式
loader 用于对模块的源代码进行转换。loader 可使你在 import 或"加载"模块时预处理文件。所以,loader 相似于其余构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader 能够将文件从不一样的语言(如 TypeScript)转换为 JavaScript,或将内联图像转换为 data URL。loader 甚至容许你直接在 JavaScript 模块中 import CSS文件!
Loaders须要单独安装而且须要在webpack.config.js中的modules关键字下进行配置,Loaders的配置包括如下几方面:
webpack提供两个工具处理样式表,css-loader 和 style-loader,两者处理的任务不一样,css-loader使你可以使用相似@import 和 url(...)的方法实现 require()的功能,style-loader将全部的计算后的样式加入页面中,两者组合在一块儿使你可以把样式表嵌入webpack打包后的JS文件中。
npm install --save-dev style-loader css-loader //安装
配置以下:
module: { rules: [ { test: /\.css$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' } ] } ] }
能够认为他是从后面开始往前面解析 css-loader ==> style-loader,因此若是是less文件除了安装less-loader以外配置文件应该写在css-loader后面,以下:
test: /\.less$/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'less-loader' } ]
Babel 是一个 JavaScript 编译器,把用最新标准编写的 JavaScript 代码向下编译成能够在今天随处可用的版本。 这一过程叫作“源码到源码”编译, 也被称为转换编译。其中核心的功能能够在babel-core模块中得到。其余的部分根据用户的需求来下载:若是想与webpack一块儿使用,须要安装babel-loader模块;若是想使用ES6特性,须要安装babel-preset-env;若是想使用React JSX,那么须要安装babel-preset-react。固然还有一些其余的配置模块,这里并无所有列出。接下来咱们看一个简单的React例子:
安装babel相关的:npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react
安装react相关的:npm install react -react-dom --save
webpack.config.js中加入以下代码:
{ test: /(\.jsx|\.js)$/, use: { loader: "babel-loader", options: { presets: [ "env", "react" ] } }, exclude: /node_modules/ }
就能实现简易的react应用了。到目前为止public中的index.html文件都是本身写在public文件夹中的,引入js文件都是本身手动的,因此再来介绍下插件
loader 被用于转换某些类型的模块,而插件则能够用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到从新定义环境中的变量。插件接口功能极其强大,能够用来处理各类各样的任务。
HtmlWebpackPlugin这个插件的做用是依据一个简单的index.html模板,生成一个自动引用你打包后的JS文件的新index.html。这在每次生成的js文件名称不一样时很是有用(好比添加了hash值)。在编译过程当中,插件会依据此模板生成最终的html页面,会自动添加所依赖的 css, js,favicon等文件
安装
npm install --save-dev html-webpack-plugin
webpack.config.js顶部引入var HtmlWebpackPlugin = require('html-webpack-plugin');
在config中的plugins字段中添加以下代码:
plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname , './app/index.html') // 引用app文件夹中的index.html做为模板 }) ]
index.html模板以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div id="root"></div> </body> </html>
在终端中输入npm run build
,接下来你将会在public文件夹中看到自动生成的index.html文件了。
模块热替换(Hot Module Replacement)
模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程当中替换、添加或删除模块,而无需从新加载整个页面。主要是经过如下几种方式,来显著加快开发速度:
以前的刷新是页面全局刷新,若是咱们只想局部刷新即只刷新修改的部分,须要使用webpack的HotModuleReplacementPlugin插件,在devServer中添加hot:true参数,在webpack.config.js的plugins中添加下面的信息:
new webpack.HotModuleReplacementPlugin()
入门 Webpack,看这篇就够了
博客园xfshen的webpack
webpack中文文档
在下的文章都是学习过程当中的总结,若是发现错误,欢迎留言指出~