js模块加载示例:
1.安装webpack
2.webpack_demo\app\main.js
var greeter = require('./Greeter.js');
document.getElementById('root').appendChild(greeter());
3.webpack_demo\app\Greeter.js
module.exports = function() {
var greet = document.createElement('div');
greet.textContent = "Hi there and greetings!";
return greet;
};
4.webpack_demo\public\index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Webpack Sample Project</title>
</head>
<body>
<div id='root' class="root">
</div>
<script src="bundle.js"></script>
</body>
</html>
5.在命令行下运行webpack
此时在public文件夹下生成了目标文件bundle.js:
6.运行index.html
通过配置文件来使用Webpack
webpack_demo\webpack.config.js:
module.exports = {
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
}
}
注意:“__dirname”是Node.js中的一个全局变量,它指向当前执行脚本所在的目录。
这样就可以直接运行webpack了:
更快捷的执行打包任务
webpack_demo/package.json:
{
"name": "webpack-sample-project",
"version": "1.0.0",
"description": "Sample webpack project",
"scripts": {
"start": "webpack"
},
"author": "zhang",
"license": "ISC",
"devDependencies": {
}
}
这样可以在命令行下npm start来运行Source Maps(使调试更容易)
var greeter = require('./Greeter.js');
document.getElementById('root1').appendChild(greeter());//id"root1"是不存在的
编译后在浏览器里运行:可以看到,错误只能定位到编译后的文件,这是不利于我们程序开发。
在webpack的配置文件中配置source maps,需要配置devtool,它有以下四种不同的配置选项,各具优缺点,描述如下:
devtool选项 | 配置结果 |
---|---|
source-map | 在一个单独的文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包文件的构建速度; |
cheap-module-source-map | 在一个单独的文件中生成一个不带列映射的map,不带列映射提高项目构建速度,但是也使得浏览器开发者工具只能对应到具体的行,不能对应到具体的列(符号),会对调试造成不便; |
eval-source-map | 使用eval打包源文件模块,在同一个文件中生成干净的完整的source map。这个选项可以在不影响构建速度的前提下生成完整的sourcemap,但是对打包后输出的JS文件的执行具有性能和安全的隐患。不过在开发阶段这是一个非常好的选项,但是在生产阶段一定不要用这个选项; |
cheap-module-eval-source-map |
这是在打包文件时最快的生成source map的方法,生成的Source Map 会和打包后的JavaScript文件同行显示,没有列映射,和eval-source-map 选项具有相似的缺点; |
正如上表所述,上述选项由上到下打包速度越来越快,不过同时也具有越来越多的负面作用,较快的构建速度的后果就是对打包后的文件的的执行有一定影响。在学习阶段以及在小到中性的项目上,eval-source-map是一个很好的选项,不过记得只在开发阶段使用它,继续上面的例子,进行如下配置:
webpack_demo/webpack.config.js:
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
}
}
编译后:此时再运行浏览器:
此时就可以定位到具体哪里出错了。
JSON加载器
npm install --save-dev style-loader css-loader
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
},
module: {//在配置文件里添加JSON loader
loaders: [
{
test: /\.json$/,
loader: "json"
}
]
}
}
var config = require('./config.json');
module.exports = function() {
var greet = document.createElement('div');
greet.textContent = config.greetText;
return greet;
};
webpack_demo\app\config.json{
"greetText": "Hi there and greetings from JSON!"
}
css加载器
npm install --save-dev style-loader css-loader
npm install --save-dev postcss-loader autoprefixer
module: {
loaders: [
{
test: /\.json$/,
loader: "json"
},
{
test: /\.css$/,
loader: 'style!css!postcss'
}
]
},
postcss: [
require('autoprefixer')//调用autoprefixer插件
],
webpack_demo\app\Greeter.css:@import url(flex.css);
#root{
background-color: #eee;
padding: 10px;
border: 3px solid #ccc;
display: flex;
}
webpack_demo\app\flex.css:.root{
display: flex;
}
编译后运行:less加载器
npm install less-loader --save-dev
webpack_demo\app\less.less:.mixin(){
color:red;
display:flex;
}
div.root{
.mixin();
}
webpack_demo\webpack.config.js:var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
},
module: {//在配置文件里添加JSON loader
loaders: [
{
test: /\.json$/,
loader: "json"
},
{
test: /\.css$/,
loader: 'style!css!postcss'//添加对样式表的处理
},
{test:/\.less$/,loader:'style-loader!css-loader!postcss!less-loader'}
]
},
postcss: [
require('autoprefixer')//调用autoprefixer插件
],
}
编译后运行结果:HtmlWebpackPlugin(简单模板插件)
npm install --save-dev html-webpack-plugin
webpack_demo\app\index.tmpl.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Webpack Sample Project</title>
</head>
<body>
<div id='root' class="root">
</div>
<script src="bundle.js"></script>
</body>
</html>
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",//已多次提及的唯一入口文件
output: {
path: __dirname + "/public",//打包后的文件存放的地方
filename: "bundle.js"//打包后输出文件的文件名
},
module: {//在配置文件里添加JSON loader
loaders: [
{
test: /\.json$/,
loader: "json"
},
{
test: /\.css$/,
loader: 'style!css!postcss'//添加对样式表的处理
}
]
},
postcss: [
require('autoprefixer')//调用autoprefixer插件
],
plugins: [
new HtmlWebpackPlugin({
template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数
})
],
}
编译后将在webpack_demo\public目录下生成index.html文件,其内容和index.tmpl.html的内容一样。