美文网首页
React | 使用webpack构建React项目

React | 使用webpack构建React项目

作者: SEATELL海说软件 | 来源:发表于2017-12-13 14:17 被阅读0次

配置 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编译jsxes6

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']

相关文章

网友评论

      本文标题:React | 使用webpack构建React项目

      本文链接:https://www.haomeiwen.com/subject/sxwaixtx.html