配置 React 项目,需要完成的工作:
1、编译 jsx,es6,scss 等资源
2、自动引入静态资源到 html 页面
3、实时编译和刷新浏览器
4、按指定模块化规范自动包装模块
5、自动给 css 添加浏览器内核前缀
6、按需打包合并 js、css
根据 webpack 文档编写最基本的 webpack 配置,直接使用 node api 的方式
/* webpack.config.js */
varwebpack= require('webpack');
//辅助函数 varutils= require('./utils');
varfullPath=utils.fullPath;
varpickFiles=utils.pickFiles;
//项目根路径 varROOT_PATH=fullPath('../');
//项目源码路径 varSRC_PATH=ROOT_PATH+'/src';
//产出路径 varDIST_PATH=ROOT_PATH+'/dist';
//是否是开发环境 var__DEV__= process.env.NODE_ENV!=='production';
// conf
varalias=pickFiles({
id:/(conf\/[^\/]+).js$/,
pattern:SRC_PATH+'/conf/*.js'
});
// components
alias= Object.assign(alias,pickFiles({
id:/(components\/[^\/]+)/,
pattern:SRC_PATH+'/components/*/index.js'
}));
// reducers
alias= Object.assign(alias,pickFiles({
id:/(reducers\/[^\/]+).js/,
pattern:SRC_PATH+'/js/reducers/*'
}));
// actions
alias= Object.assign(alias,pickFiles({
id:/(actions\/[^\/]+).js/,
pattern:SRC_PATH+'/js/actions/*'
}));
varconfig= {
context:SRC_PATH,
entry: {
app: ['./pages/app.js']
},
output: {
path:DIST_PATH,
filename:'js/bundle.js'
},
module: {},
resolve: {
alias:alias
},
plugins: [
newwebpack.DefinePlugin({
// http://stackoverflow.com/questions/30030031/passing-environment-dependent-variables-in-webpack
"process.env.NODE_ENV":JSON.stringify(process.env.NODE_ENV||'development')
})
]
};
module.
exports=config;
/* webpack.dev.js */
varwebpack= require('webpack');
varWebpackDevServer= require('webpack-dev-server');
varconfig= require('./webpack.config');
varutils= require('./utils');
varPORT=8080;
varHOST=utils.getIP();
varargs= process.argv;
varhot=args.indexOf('--hot') > -1;
vardeploy=args.indexOf('--deploy') > -1;
//本地环境静态资源路径 varlocalPublicPath='http://'+HOST+':'+PORT+'/';
config.output.publicPath=localPublicPath;
config.entry.app.unshift('webpack-dev-server/client?'+localPublicPath);
newWebpackDevServer(webpack(config), {
hot:hot,
inline:true,
compress:true,
stats: {
chunks:false,
children:false,
colors:true
},
// Set this as true if you want to access dev server from arbitrary url.
// This is handy if you are using a html5 router.
historyApiFallback:true,
}).listen(
PORT,HOST,function() {
console.log(localPublicPath);
});
编译 jsx、es6、scss 等资源:
● 使用 bael 和 babel-loader 编译 jsx、es6
● 安装插件: babel-preset-es2015 用于解析 es6
● 安装插件:babel-preset-react 用于解析 jsx
// 首先需要安装 babel
$ npm i babel-core
// 安装插件
$ npm i babel-preset-es2015babel-preset-react
// 安装 loader
$ npm i babel-loader
在项目根目录创建 .babelrc 文件:
{
"presets": ["es2015","react"]
}
在 webpack.config.js 里添加:
//使用缓存varCACHE_PATH= ROOT_PATH +'/cache';
// loaders
config.module.loaders= [];
//使用babel编译jsx、es6
config.module.loaders.push({
test:/\.js$/,
exclude:/node_modules/,
include: SRC_PATH,
//这里使用 loaders,因为后面还需要添加 loader
loaders: ['babel?cacheDirectory='+CACHE_PATH]
});
接下来使用 sass-loader 编译 sass:
$ npm i sass-loader node-sasscss-loader style-loader
●css-loader 用于将 css 当做模块一样来 import
●style-loader 用于自动将 css 添加到页面
在 webpack.config.js 里添加:
//编译 sass
config.module.loaders.push({
test:/\.(scss|css)$/,
loaders: ['style','css','sass']
});
自动引入静态资源到相应 html 页面
● 使用 html-webpack-plugin
$ npm i html-webpack-plugin
在 webpack.config.js 里添加:
// html 页面 varHtmlwebpackPlugin= require('html-webpack-plugin');
config.
plugins.push(
newHtmlwebpackPlugin({
filename:'index.html',
chunks: ['app'],
template: SRC_PATH +'/pages/app.html'
})
);
打包合并 js、css
webpack 默认将所有模块都打包成一个 bundle,并提供了 Code Splitting 功能便于我们按需拆分。在这个例子里我们把框架和库都拆分出来:
在 webpack.config.js 添加:
config.entry.lib= [
'react','react-dom','react-router',
'redux','react-redux','redux-thunk'
]
config.output.filename='js/[name].js';
config.
plugins.push(
newwebpack.optimize.CommonsChunkPlugin('lib','js/lib.js')
);
//别忘了将 lib 添加到 html 页面
// chunks: ['app', 'lib']
网友评论