一:首先在d盤下面創建一個文件夾名為webpack,在webpack下創建一個文件夾名為react,使用phpstorm打開react文件夾,打開Terminal,執行操作
npm init
初始化一下項目,生成package.json
文件
二:在文件根目錄下創建文件“webpack.config.js”,在根目錄下面創建一個文件夾命名為“src”,在下面創建一個文件命名為index.js,在項目中安裝webpack,在Terminal中執行操作
npm install --save-dev webpack
Webpack提供一個可選的本地開發服務器,這個本地服務器基於node.js構建,可以實現你想要的這些功能,不過它是一個單獨的組件,在webpack中進行配置之前需要單獨安裝它作為項目依賴
npm install --save-dev webpack-dev-server
編寫配置文件webpack.config.js
var path = require('path'); //引文文件路徑
module.exports = {
entry: ['./src/index'], //入口文件
output: {
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
}
}
修改package.json文件
"scripts": {
"start": "webpack"
},
在Terminal中執行
npm run start
執行打包過程

在dist文件夾中生成index.js文件

三:Webpack把所有的文件都可以當做模塊處理,包括JavaScript代碼,也包括CSS和fonts以及圖片等等等,只有通過合適的loaders,它們都可以被當做模塊被處理。
CSS
webpack提供兩個工具處理樣式表,css-loader 和 style-loader,二者處理的任務不同,css-loader使你能夠使用類似@import 和 url(...)的方法實現 require()的功能,style-loader將所有的計算后的樣式加入頁面中,二者組合在一起使你能夠把樣式表嵌入webpack打包后的JS文件中。在src目錄下面添加文件main.css,並添加代碼
h1{
color:red
}
在Terminal執行操作
npm install --save-dev style-loader css-loader
安裝完畢之后,在webpack.config.js中添加配置
module: {
loaders: [
{
test: /\.css$/,
loader: 'style-loader!css-loader'//添加對樣式表的處理
}
]
},
在index.js文件中添加代碼
require("./main.css")
執行
npm run start
打包完畢,並沒有新文件生成,是由於webpack將樣式文件和javascript合並到了同一個文件中去了。使用 extract-text-webpack-plugin就可以把css從js中獨立抽離出來,首先執行extract-text-webpack-plugin插件的安裝操作
npm install --save-dev extract-text-webpack-plugin
插件安裝完畢后,修改webpac.config.js中的配置文件為
var path = require('path'); //引文文件路徑
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
entry: ['./src/index'], //入口文件
output: {
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
module: {
loaders: [
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
}
]
},
plugins: [
new ExtractTextPlugin("styles.css"),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
}
}
執行打包操作


自動生成html插件的安裝,“
html-webpack-plugin
”插件可以根據模板生成html,在src下創建一個index.html文件,作為生成html的模板文件
npm install html-webpack-plugin --save-dev
修改配置文件如下
var path = require('path'); //引文文件路徑 var webpack = require('webpack'); var ExtractTextPlugin = require("extract-text-webpack-plugin"); var HtmlWebpackPlugin = require('html-webpack-plugin'); var autoprefixer = require('autoprefixer'); module.exports = { entry: ['./src/index'], //入口文件 output: { path: path.join(__dirname, 'dist'), //打包出口文件路徑 filename: 'index.js' //打包文件名 }, module: { loaders: [ { test: /\.css$/, use: [ { loader: 'style-loader', }, { loader: 'css-loader', options: { importLoaders: 1, } }, { loader: 'postcss-loader' } ] }, ] }, plugins: [ new webpack.HotModuleReplacementPlugin(), new webpack.optimize.UglifyJsPlugin({ mangle: { except: ['$super', '$', 'exports', 'require'] } }), new ExtractTextPlugin("main.css"), new HtmlWebpackPlugin({ template: './src/index.html', //模板路徑 filename: "index.html", inject: false, }), ], devServer: { //配置nodejs本地服務器, contentBase: './dist', hot: true //本地服務器熱更新 } }
四:每次打包之前,刪除上一次打包生成的文件
clean-webpack-plugin:A webpack plugin to remove/clean your build folder(s) before building(清除打包文件夾的一個插件),首先安裝
npm install clean-webpack-plugin --save-dev
安裝完成之后,添加配置文件
var CleanWebpackPlugin = require('clean-webpack-plugin');
new CleanWebpackPlugin(['dist'], {
root: 'd:/webpack/demo1/',
verbose: true,
dry: false,
}),
五:webpack服務配置和打包配置
webpack-dev-server是一個小型的Node.js Express服務器,它使用webpack-dev-middleware來服務於webpack的包,除此自外,它還有一個通過Sock.js來連接到服務器的微型運行時.,在根目錄下面創建一個文件名為 “webpack.config.dev.js“ 作為一個臨時的服務,配置文件為:
webpack.config.dev.js
var path = require('path'); //引文文件路徑
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var autoprefixer = require('autoprefixer');
module.exports = {
devtool: 'source-map',
entry: ['./src/index'], //入口文件
output: {
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
module: {
loaders: [
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
}
},
{
loader: 'postcss-loader'
}
]
},
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
}),
new ExtractTextPlugin("main.css"),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
}
}
在文件根目錄下添加一個文件“webpack.config.prod.js”,作為打包文件,添加配置文件為
webpack.config.prod.js
var path = require('path'); //引文文件路徑
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin = require('html-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
var autoprefixer = require('autoprefixer');
module.exports = {
devtool: 'source-map',
entry: ['./src/index'], //入口文件
output: {
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
module: {
loaders: [
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
options: {
importLoaders: 1,
}
},
{
loader: 'postcss-loader'
}
]
},
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
}),
new ExtractTextPlugin("main.css"),
new HtmlWebpackPlugin({
template: './src/index.html', //模板路徑
filename: "index.html",
inject: false,
}),
new CleanWebpackPlugin(['dist'], {
root: 'd:/webpack/demo1/',
verbose: true,
dry: false,
}),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
}
}
修改package.json文件
"scripts": {
"build": "webpack --config webpack.config.prod.js",
"dev": "webpack-dev-server --config webpack.config.dev.js"
},
六添加解析less樣式文件的擴展
安裝代碼為
npm install --save-dev less-loader less
添加擴展,修改配置文件為
var path = require('path'); //引文文件路徑
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin = require('html-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
devtool: 'source-map',
entry: ['./src/index'], //入口文件
output: {
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
module: {
loaders: [
{
//正則匹配后綴.css文件;
test: /\.css$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
//加載css-loader、postcss-loader(編譯順序從下往上)轉譯css
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader',
//配置參數;
options: {
//從postcss插件autoprefixer 添加css3前綴;
plugins: function() {
return [
//加載autoprefixer並配置前綴,可加載更多postcss插件;
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
}]
})
},
{//正則匹配后綴.less文件;
test: /\.less$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader', //配置參數;
options: {
plugins: function() {
return [
require('autoprefixer')
({
browsers: ['ios >= 7.0']
})];
}
}
},
//加載less-loader同時也得安裝less;
"less-loader"
]
})
},
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
}),
new ExtractTextPlugin({
filename :"[name].css",
}),
new HtmlWebpackPlugin({
template: './src/index.html', //模板路徑
filename: "index.html",
inject: "body",
}),
//webpack內置js壓縮插件;
new webpack.optimize.UglifyJsPlugin({
compress: { //壓縮;
warnings: false //關閉警告;
}
}),
new CleanWebpackPlugin(['dist'], {
root: 'd:/webpack/react/',
verbose: true,
dry: false,
}),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
},
resolve:{
//設置可省略文件后綴名(注:如果有文件沒有后綴設置‘’會在編譯時會報錯,必須改成' '中間加個空格。ps:雖然看起來很強大但有時候省略后綴真不知道加載是啥啊~);
extensions: [' ','.css','.scss','.sass','.less','.js','.json'],
//查找module的話從這里開始查找;
modules: [path.resolve(__dirname, "src"), "node_modules"], //絕對路徑;
//別名設置,主要是為了配和webpack.ProvidePlugin設置全局插件;
alias: {
//設置全局jquery插件;
}
}
}
安裝壓縮圖片的擴展,首先執行命令
npm install img-loader url-loader file-loader --save-dev
安裝完成之后,在loaders數組中添加一條配置
{
//正則匹配后綴.png、.jpg、.gif圖片文件;
test: /\.(png|jpg|gif)$/i,
use: [{//加載url-loader 同時安裝 file-loader;
loader : 'url-loader',
options : {
//小於10000K的圖片文件轉base64到css里,當然css文件體積更大;
limit : 10000,
//設置最終img路徑;
name : '/img/[name].[ext]'
}
},
{
//壓縮圖片(另一個壓縮圖片:image-webpack-loader);
loader : 'img-loader?minimize&optimizationLevel=5&progressive=true'
},]
}
在src目錄下面添加一個img目錄,拷貝一張圖片放到img目錄下,命名為img,然后,修改main.css文件如下
h1{ color:red; display: flex; background:url("./img/img.jpg"); }
然后執行以下,build,可以發現在dist目錄下生成如下文件

七 支持es6,安裝es6擴展,執行安裝命令
npm install babel-core babel-loader babel-preset-es2015 --save-dev
安裝完成之后,修改配置文件,在“loaders”數組中添加一個擴展的配置為
{
//正則匹配后綴.js文件;
test: /\.js$/,
//需要排除的目錄
exclude: '/node_modules/',
//加載babel-loader轉譯es6
use: [{
loader: 'babel-loader',
}],
},
在根文件目錄下添加文件“.babelrc”,次文件沒有擴展名,可以sublime或者phpstorm等編輯器來創建,給".babelrc"文件中添加如下配置
{
"presets": ["es2015"],
"sourceMaps": true
}
配置完成之后,就可以使用es6的新語法了。打包過程中出現了提示,樣式文件超過了500kb,可以使用插件“optimize-css-assets-webpack“來壓縮css樣式文件
安裝語法如下
npm install optimize-css-assets-webpack-plugin --save-dev
修改配置文件如下
var path = require('path'); //引文文件路徑
var webpack = require('webpack');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin = require('html-webpack-plugin');
var CleanWebpackPlugin = require('clean-webpack-plugin');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); //壓縮CSS模塊;
module.exports = {
devtool: 'source-map',
entry: ['./src/index'], //入口文件
output: {
publicPath: "http://localhost:8081/", //配合devServer本地Server;
path: path.join(__dirname, 'dist'), //打包出口文件路徑
filename: 'index.js' //打包文件名
},
module: {
loaders: [
{
//正則匹配后綴.js文件;
test: /\.js$/,
//需要排除的目錄
exclude: '/node_modules/',
//加載babel-loader轉譯es6
use: [{
loader: 'babel-loader',
}],
},
{
//正則匹配后綴.css文件;
test: /\.css$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
//加載css-loader、postcss-loader(編譯順序從下往上)轉譯css
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader',
//配置參數;
options: {
//從postcss插件autoprefixer 添加css3前綴;
plugins: function() {
return [
//加載autoprefixer並配置前綴,可加載更多postcss插件;
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
}]
})
},
{//正則匹配后綴.less文件;
test: /\.less$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader', //配置參數;
options: {
plugins: function() {
return [
require('autoprefixer')
({
browsers: ['ios >= 7.0']
})];
}
}
},
//加載less-loader同時也得安裝less;
"less-loader"
]
})
},
{
//正則匹配后綴.png、.jpg、.gif圖片文件;
test: /\.(png|jpg|gif)$/i,
use: [{//加載url-loader 同時安裝 file-loader;
loader : 'url-loader',
options : {
//小於10000K的圖片文件轉base64到css里,當然css文件體積更大;
limit : 10000,
//設置最終img路徑;
name : '/img/[name].[ext]'
}
},
{
//壓縮圖片(另一個壓縮圖片:image-webpack-loader);
loader : 'img-loader?minimize&optimizationLevel=5&progressive=true'
},]
}
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
}),
new ExtractTextPlugin({
filename :"[name].css",
}),
new HtmlWebpackPlugin({
template: './src/index.html', //模板路徑
filename: "index.html",
inject: "body",
}),
//webpack內置js壓縮插件;
new webpack.optimize.UglifyJsPlugin({
compress: { //壓縮;
warnings: false //關閉警告;
}
}),
new CleanWebpackPlugin(['dist'], {
root: 'd:/webpack/react/',
verbose: true,
dry: false,
}),
//壓縮css(注:因為沒有用style-loader打包到js里所以webpack.optimize.UglifyJsPlugin的壓縮本身對獨立css不管用);
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g, //正則匹配后綴.css文件;
cssProcessor: require('cssnano'), //加載‘cssnano’css優化插件;
cssProcessorOptions: { discardComments: {removeAll: true } }, //插件設置,刪除所有注釋;
canPrint: true //設置是否可以向控制台打日志,默認為true;
}),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
},
resolve:{
//設置可省略文件后綴名(注:如果有文件沒有后綴設置‘’會在編譯時會報錯,必須改成' '中間加個空格。ps:雖然看起來很強大但有時候省略后綴真不知道加載是啥啊~);
extensions: [' ','.css','.scss','.sass','.less','.js','.json'],
//查找module的話從這里開始查找;
modules: [path.resolve(__dirname, "src"), "node_modules"], //絕對路徑;
//別名設置,主要是為了配和webpack.ProvidePlugin設置全局插件;
alias: {
//設置全局jquery插件;
}
}
}
八 安裝react
在終端輸入
npm install --save-dev react react-dom
同時安裝React和React-DOM,標准的React組件后綴名為.jsx,而.jsx是默認不被瀏覽器所支持的;所以需要一個轉換器,將不被瀏覽器識別的.jsx文件轉換成瀏覽器能夠正常運行的文件,這個轉換器就是Babel
用npm一次性安裝這些依賴包
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
在webpack.config.js中,修改配置文件如下
{
//正則匹配后綴.js 和.jsx文件;
test: /\.(js|jsx)$/,
//需要排除的目錄
exclude: '/node_modules/',
//加載babel-loader轉譯es6
use: [{
loader: 'babel-loader',
}],
},
修改.babelrc文件添加如下代碼:
"presets": [
"react",
"es2015"
],
在src->component目錄下新建一個Component.jsx文件(注意首字母一定要大寫),使用ES6語法返回一個React組件,代碼如下
//Component1.jsx
import React from 'react';
class Component1 extends React.Component {
render() {
return (
<div>Hello World!</div>
)
}
}
//導出組件
export default Component1;
在index.js中使用ES6的語法,定義和渲染Component1模塊,將React組件渲染至html的標簽中:
import React from 'react';
import ReactDom from 'react-dom';
import Component1 from './component/Component1';
ReactDom.render(
<Component1 />,
document.getElementById('root')
);
執行一下 run npm build和run npm dev,在瀏覽器中查看127.0.0.1:8081 輸出"hello world"
九 執行 npm run dev,瀏覽器自行打開瀏覽器,安裝插件
npm install open-browser-webpack-plugin --save-dev
修改“webpack.config.dev.js”的配置為
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin');
var OpenBrowserPlugin = require('open-browser-webpack-plugin');
module.exports = {
devtool: 'cheap-eval-source-map',
entry: [
'./src/index'
],
output: {
publicPath: "http://localhost:8081/",
path: path.join(__dirname, 'build'),
filename: 'index.js'
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new ExtractTextPlugin("styles.css"),
new OpenBrowserPlugin({ url: 'http://localhost:8081' }),
new HtmlWebpackPlugin({
template: './src/index.html'
})
],
module: {
loaders: [
{
test: /\.css$/,
loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
}
,{
test: /\.js$/,
loaders: ['babel-loader'],
exclude:/node_modules/
},{
test: /\.json$/,
loader: "json-loader"
},{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
},]}
]
},
devServer: {
contentBase: './build',
hot: true,
host: '127.0.0.1',
port: '8081'
}
}
十 安裝 ant-design ui開發環境
推薦使用 npm 或 yarn 的方式進行開發,不僅可在開發環境輕松調試,也可放心地在生產環境打包部署使用,享受整個生態圈和工具鏈帶來的諸多好處,npm安裝語句為
npm install antd --save
在 npm 發布包內的 antd/dist 目錄下提供了 antd.js antd.css 以及 antd.min.js antd.min.css,這里通過 “babel-plugin-import”來引用擴展文件,首先安裝擴展
npm install babel-plugin-import --save-dev
然后修改 “.bablerc”的配置項如下
{
"presets": [
"es2015",
"react"
],
"plugins": [
[
"import",
{
"libraryName": "antd",
"style": true
}
]
],
"sourceMaps": true
}
最后添加一個ant-design 控件來進行測試,在index.js文件中添加如下代碼
import React from 'react';
import ReactDOM from 'react-dom';
import { DatePicker, message } from 'antd';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
date: '',
};
}
handleChange(date) {
message.info('您選擇的日期是: ' + date.toString());
this.setState({ date });
}
render() {
return (
<div style={{ width: 400, margin: '100px auto' }}>
<DatePicker onChange={value => this.handleChange(value)} />
<div style={{ marginTop: 20 }}>當前日期:{this.state.date.toString()}</div>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
執行build的程序,然后執行dev,查看到的結果如圖

十一:最后我的文件目錄如圖所示

其中“webpack.config.prod.js“配置如下
const path = require('path'); //引文文件路徑
const webpack = require('webpack');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const glob = require('glob'); // glob模塊,用於讀取webpack入口目錄文件
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); //壓縮CSS模塊;
const CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;//處理trunk
const entries = getEntry('src/**/*.js', 'src/**/');
const config = {
devtool: 'source-map',
entry: entries,
output: {
publicPath: "http://localhost:8081/", //配合devServer本地Server;
path: path.join(__dirname, 'build'), //打包出口文件路徑
filename: "[name].js",
},
module: {
loaders: [
{
//正則匹配后綴.js文件;
test: /\.(js|jsx)$/,
//需要排除的目錄
exclude: '/node_modules/',
//加載babel-loader轉譯es6
use: [{
loader: 'babel-loader',
}],
},
{
//正則匹配后綴.css文件;
test: /\.css$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
//加載css-loader、postcss-loader(編譯順序從下往上)轉譯css
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader',
//配置參數;
options: {
//從postcss插件autoprefixer 添加css3前綴;
plugins: function() {
return [
//加載autoprefixer並配置前綴,可加載更多postcss插件;
require('autoprefixer')({
browsers: ['ios >= 7.0']
})
];
}
}
}]
})
},
{//正則匹配后綴.less文件;
test: /\.less$/,
//使用html-webpack-plugin插件獨立css到一個文件;
use: ExtractTextPlugin.extract({
use: [{
loader : 'css-loader?importLoaders=1',
},
{
loader : 'postcss-loader', //配置參數;
options: {
plugins: function() {
return [
require('autoprefixer')
({
browsers: ['ios >= 7.0']
})];
}
}
},
//加載less-loader同時也得安裝less;
"less-loader"
]
})
},
{
//正則匹配后綴.png、.jpg、.gif圖片文件;
test: /\.(png|jpg|gif)$/i,
use: [{//加載url-loader 同時安裝 file-loader;
loader : 'url-loader',
options : {
//小於10000K的圖片文件轉base64到css里,當然css文件體積更大;
limit : 10000,
//設置最終img路徑;
name : '/img/[name].[ext]'
}
},
{
//壓縮圖片(另一個壓縮圖片:image-webpack-loader);
loader : 'img-loader?minimize&optimizationLevel=5&progressive=true'
},]
}
]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.optimize.UglifyJsPlugin({
mangle: {
except: ['$super', '$', 'exports', 'require']
}
}),
new CommonsChunkPlugin({
name: 'vendors',
minChunks: Infinity
}),
new ExtractTextPlugin({
filename :"[name].css",
}),
// new HtmlWebpackPlugin({
// template: './src/index.html', //模板路徑
// filename: "index.html", //輸出名字
// inject: "body", //打包文件插入模板的位置
// }),
//webpack內置js壓縮插件;
new webpack.optimize.UglifyJsPlugin({
compress: { //壓縮;
warnings: false //關閉警告;
}
}),
new CleanWebpackPlugin(['build'], {
root: 'd:/webpack/react/', //要刪除文件的絕對路徑
verbose: true,
dry: false,
}),
//壓縮css(注:因為沒有用style-loader打包到js里所以webpack.optimize.UglifyJsPlugin的壓縮本身對獨立css不管用);
new OptimizeCssAssetsPlugin({
assetNameRegExp: /\.css$/g, //正則匹配后綴.css文件;
cssProcessor: require('cssnano'), //加載‘cssnano’css優化插件;
cssProcessorOptions: { discardComments: {removeAll: true } }, //插件設置,刪除所有注釋;
canPrint: true //設置是否可以向控制台打日志,默認為true;
}),
],
devServer: {
//配置nodejs本地服務器,
contentBase: './dist',
hot: true //本地服務器熱更新
},
resolve:{
//設置可省略文件后綴名(注:如果有文件沒有后綴設置‘’會在編譯時會報錯,必須改成' '中間加個空格。ps:雖然看起來很強大但有時候省略后綴真不知道加載是啥啊~);
extensions: [' ','.css','.scss','.sass','.less','.js','.json'],
//別名設置,主要是為了配和webpack.ProvidePlugin設置全局插件;
alias: {
//設置全局jquery插件;
}
}
};
var pages = Object.keys(getEntry('src/**/*.js', 'src/**/'));
pages.forEach(function(pathname) {
console.log(pathname);
var conf = {
filename: pathname + '.html', //生成的html存放路徑,相對於path
template: 'src/index.html', //html模板路徑
inject:false,
};
config.plugins.push(new HtmlWebpackPlugin(conf));
});
module.exports = config;
function getEntry(globPath, pathDir) {
var files = glob.sync(globPath);
var entries = {},
entry, dirname, basename, pathname, extname;
for (var i = 0; i < files.length; i++) {
entry = files[i];
dirname = path.dirname(entry);
extname = path.extname(entry);
basename = path.basename(entry, extname);
pathname = path.normalize(path.join(dirname, basename));
pathDir = path.normalize(pathDir);
if(pathname.startsWith(pathDir)){
pathname = pathname.substring(pathDir.length)
}
entries[pathname] = ['./' + entry];
}
return entries;
}
