一、老生长叹的代码异步加载
1、使用webpack api: require 按需加载本地js文件
文档见:require.ensure
例如在react router中:
getComponent (nextState, cb) {
require.ensure([], (require) => {
cb(null, connectComponent(require('COMPONENT/XXX/').default))
}, 'XXX')
}
在用户发出跳转到这个url的动作时,会调用getComponent 方法
此时同步调用require.ensure 方法,在该方法的异步回调里加载该component依赖的js打包文件
2、使用ExtractTextWebpackPlugin 按需加载本地css文件
配置示例:
loader: ExtractTextPlugin.extract({fallback: 'style-loader', use: [{
loader: 'css-loader',
options: {
minimize: true
}
}, {
loader: "postcss-loader",
options: {
plugins: function () {
return [
pxtorem({
rootValue: 100,
propWhiteList: []
})
]
}
}
}]})
new ExtractTextPlugin({
filename: '[name].[contenthash:6].css',
// allChunks : true // 若要按需加载 CSS 则请注释掉该行
})
3、使用scriptjs 按需加载外部js文件
因为有时项目会依赖第三方js文件,这时需要请求外部链接,而且很多时候该文件需要加载在全局环境
引入方式:
<script src="https://XXXX/js/script.min.js"></script>
在html文件中直接加入script 标签即可,加入后即可在任意方法中同步或异步加载外部资源了
$script('https://XXXX/xxxx.js', function () {
$script('XXXX/xxxx.min.js', function () {
// callback
})
})
4、按需加载外部css文件
因为scriptjs只支持js,如果有对应的外部css文件怎么办呢?
let node = document.createElement('link');
node.rel = 'stylesheet';
node.href = cssUrl;
document.getElementsByTagName('head')[0].appendChild(node);
// 下面的代码是在redux中标识别该资源已经被加载过
// 以确保再次加载该方法的时候不会重复加载css
// (不用redux的时候在任意全局变量里标识即可)
initState.resource[cssUrl] = 1;
二、资源打包和转换
1、代码中使用require 加载图片等资源
<img src={require('./img/xxxx@3x.png')} width="100%"/>
这里使用了url-loader,webpack会根据资源大小选择不同的两种加载方式
{
test: /\.(png|jpe?g|gif)$/,
loader: 'url-loader',
query: {
limit: 10240, // 10KB 以下使用 base64
name: 'img/[name]-[hash:6].[ext]'
}
}
这里的limit 数值可以自行设置
2、合并打包第三方公用库,全局加载
entry: {
app: path.join(src, 'app.js'),
// ================================
// 框架 / 类库 分离打包
// ================================
vendor: [
'react',
'react-dom',
'react-redux',
'react-router',
'react-router-redux',
'redux',
'redux-thunk',
'XXXXX'
]
}
全局加载venfor.js 文件,并使用CommonsChunkPlugin 第三方库 chunk即可
new webpack.optimize.CommonsChunkPlugin({
names: ['vendor']
})