webpack配置文件:webpack.config.js(一)

1、webpack的配置文件webpack.config.js

//const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    mode:'none',
    entry: './src/index.js',
    output: {
        path: __dirname + '/dist',
        filename: 'dist.js'
    },
}

上面代码是一个最最基本的webpac配置文件,
entry是指定要打包的入口文件,(多页面可以有多个入口
output指定打包之后文件的路径和文件名(只有一个出口
(其中几个目录请手动新建:src是放我们源码的文件夹,dist是放我们编译后文件的文件夹。)

有了基本的webpack.config.js,我们用webpack来打包就简单了,可以直接执行下面命令:

webpack

webpack默认就会去寻找根目录下的webpack.config.js文件。

打包成功,dist/js文件夹下就会生成一个dist.js。

2、我们也可以指定webpack的配置文件名

webpack.config.js是webpack默认的配置文件名,如果我们有一个webpack.dev.config.js配置,又如何让webpack来读取它呢?
只需要在执行打包命令的时候,加一个参数: --config `文件名

webpack --config `webpack.dev.config.js

3、webpack配合npm

还记得我们在npm init初始化之后,生成了一个package.json文件么?我们现在终于要用到它了。
我们在package.json文件中,增加一个scripts:

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack --config webpack.config.js"
  },

上面我们增加了一个webpack项,我们可以看出其值其实也是执行的webpack命令
既然我们是要webpack和npm配合,那么上面的配置到底有什么作用呢?
我们可以通过npm来调用webpack来,执行下面命令,同样完成webpack打包操作:

npm run webpack

npm run xxxx,其中 xxxx 就是我们上面配增加的scripts命令

4、webpack配置的entry

entry是webpack打包的入口指示。

//entry:'路径',
entry:'./src/script/main.js',

它有三种形式:

1)、最简单的就是一个string,也是只有一个入口文件。我们前面已经见识了。

entry:'./src/script/main.js',

这种形式,你的所有的依赖,都在这个文件main.js中引入进来

2)、数组的形式

entry:['./entry1','./entry2']

3)、对象的形式

entry: {
  page1:'./page1',
  page2:['./entry1','./entry2']
}

上面 数组的形式和对象形式,都2个入口。

5、webpack配置的output

然后我们把webpack.config.js中output段修改如下:

  output:{
        path:'./dist/js',
        filename:'[name]-[hash].js'  //这样我们打包之后的文件就是**main-本次打包的hash值.js**。
    }

这样我们打包之后的文件就是 main-本次打包的hash值.js

还可以:

filename:'[name]-[chunkhash].js'

这其中的hash值,我们可以认为是版本号,也就是说,只有在我们的文件改变了的时候,这个hash值才会有变化。最后打包的文件名就是随机的。

6、webpack配置的plugins

使用插件的方法:配置plugins:

1、要使用某个插件,需要通过npm安装它,然后在webpack.config.js中的plugins关键字部分添加该插件的一个实例(plugins是一个数组,new一个插件即可)

如添加一个实现版权声明的插件:

module.exports = {
  		mode: 'none',
  		entry:  __dirname + "/app/main.js",
  		output: {...},
	module: {
    		loaders: [
      			{ test: /\.json$/, loader: "json" },
      			{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
      			{ test: /\.css$/, loader: 'style!css?modules!postcss' }//这里添加PostCSS
    		]
 	},
  	postcss: [
    	require('autoprefixer')
  	],
  	//添加该插件的一个实例
  	plugins: [
    	new webpack.BannerPlugin("Copyright Flying Unicorns inc.")  
	],
	devServer: {...}
}

2、几个常用的插件

1) HtmlWebpackPlugin

这个插件的作用是依据一个简单的模板,帮助生成最终的Html5文件,这个文件中自动引用了打包后的JS文件。每次编译都在文件名中插入一个不同的哈希值。

安装命令:npm install --save-dev html-webpack-plugin

这个插件自动完成了之前手动做的一些事情,在正式使用之前需要对项目结构做一些改变:

① 移除public文件夹,利用此插件,HTML5文件会自动生成,此外CSS已经通过前面的操作打包到JS中了。

② 在app目录下,创建一个HTML文件模板index.tmpl.html,这个模板包含title等其它需要的元素,在编译过程中,本插件会依据此模板生成最终的HTML页面,会自动添加所依赖的 css, js,favicon等文件,模板源代码如下:

<!DOCTYPE html>
<html lang="en">
	<head>
	</head>
	<body>
 		<div id='root'></div>
	</body>
</html>

③ 更新webpack的配置文件,方法同上,新建一个build文件夹用来存放最终的输出文件。

var webpack = require('webpack');var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  		devtool: 'eval-source-map',
  		entry:  __dirname + "/app/main.js",
  		output: {
    			path: __dirname + "/build",
    			filename: "bundle.js"
  		},
	module: {
    			loaders: [
      				{ test: /\.json$/, loader: "json" },
      				{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
      			{ test: /\.css$/, loader: 'style!css?modules!postcss' }
    		]
  		},
  		postcss: [
    			require('autoprefixer')
  		],
  		plugins: [
    			new HtmlWebpackPlugin({
      				template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数
    			})
  		],
	devServer: {
    			colors: true,
    			historyApiFallback: true,
    			inline: true
  		}
}

2) Hot Module Replacement
Hot Module Replacement(HMR)也是webpack里很有用的一个插件,它允许在修改组件代码后,自动刷新实时预览修改后的效果。
在webpack中实现HMR也很简单,只需要做两项配置

① 在webpack配置文件中添加HMR插件;

② 在Webpack Dev Server中添加“hot”参数。

不过配置完这些后,JS模块其实还是不能自动热加载的,还需要在JS模块中执行一个Webpack提供的API才能实现热加载,虽然这个API不难使用,但是如果是React模块,使用已经熟悉的Babel可以更方便的实现功能热加载。

具体实现方法如下:

① Babel和webpack是独立的工具;

② 二者可以一起工作;

③ 二者都可以通过插件拓展功能;

④ HMR是一个webpack插件,它让你能浏览器中实时观察模块修改后的效果,但是如果你想让它工作,需要对模块进行额外的配额;

⑤ Babel有一个叫做react-transform-hrm的插件,可以在不对React模块进行额外的配置的前提下让HMR正常工作。

var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  		devtool: 'eval-source-map',
  		entry: __dirname + "/app/main.js",
  		output: {
    			path: __dirname + "/build",
    			filename: "bundle.js"
  		},
  		module: {
    			loaders: [
      				{ test: /\.json$/, loader: "json" },
      				{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
      				{ test: /\.css$/, loader: 'style!css?modules!postcss' }
    			]	
  		},
  		postcss: [
    			require('autoprefixer')
  		],
	plugins: [
    			new HtmlWebpackPlugin({
      				template: __dirname + "/app/index.tmpl.html"
    			}),
    			new webpack.HotModuleReplacementPlugin()//热加载插件
  		],
	devServer: {
    			colors: true,
    			historyApiFallback: true,
    			inline: true,
   			hot: true
  		}
}

安装react-transform-hmrnpm install --save-dev babel-plugin-react-transform react-transform-hmr

配置Babel :

{
  		"presets": ["react", "es2015"],
 		"env": {
    			"development": {
    				"plugins": [["react-transform", {
       				"transforms": [{
         					"transform": "react-transform-hmr",
					"imports": ["react"],
					"locals": ["module"]
       				}]
     				}]]
		}
    		}
}

使用React时,可以热加载模块了。

上一篇:flutter 网络权限配置


下一篇:[UE4]Set Skeletal Mesh,在蓝图中设置骨骼模型