安裝完各個loader後,咱們就須要配置一下咱們的webpack.config.js,載入咱們的loader。javascript
// webpack.config.js module.exports = { entry: path.join(__dirname, 'src/entry.js'), output: { path: path.join(__dirname, 'out'), publicPath: "./out/", filename: 'bundle.js' }, // 新添加的module屬性 module: { loaders: [ {test: /\.js$/, loader: "babel"}, {test: /\.css$/, loader: "style!css"}, {test: /\.(jpg|png)$/, loader: "url?limit=8192"}, {test: /\.scss$/, loader: "style!css!sass"} ] } };
咱們主要看看module的loaders。loaders是一個數組,裏面的每個對象都用正則表達式,對應着一種配對方案。Webpack提供了一套加載器,好比css-loader,less-loader,style-loader,url-loader等,用於將不一樣的文件加載到js文件中,好比url-loader用於在js中加載png/jpg格式的圖片文件;css/style loader用於加載css文件;less-loader加載器是將less編譯成css文件;不一樣的處理器經過!
分隔並串聯起來。這裏的loader是能夠省略掉-loader
這樣的,也就是本來應該寫成style-loader!css-loader!sass-loader.
css
所以你須要根據package.json來初始化本項目的依賴模塊,執行命令:npm install;html
其中less/main.less 文件以下代碼:java
@base:red; body{ margin:10px; background-color:@base; }
如今我想經過html-webpack-plugin插件動態生成 html頁面及引入index.js 和 生成 index.js文件;node
webpack.config.js代碼配置以下:webpack
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); //定義了一些文件夾的路徑 var ROOT_PATH = path.resolve(__dirname); var SRC_PATH = path.resolve(ROOT_PATH, 'src'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { entry: SRC_PATH + "/js/index.js", output: { filename: "build.js", path: BUILD_PATH }, module: { loaders: [ {test: /\.less$/,loader: "style!css!less"} ] }, resolve: { extensions: ['', '.js', '.jsx'] }, plugins: [ new HtmlwebpackPlugin({ title: 'Hello World app', filename: 'index.html', inject: true, hash: true }) ] };
在項目的根目錄運行webpack,便可動態生成html文件和js文件,打開生成後的index.html便可看到css生效了,且css被動態內鏈到head標籤內了。es6
上面是使用webpack打包;如今咱們再來看看使用第二種方案來打包~web
使用gulp來進行打包正則表達式
咱們知道使用gulp來打包的話,那麼咱們須要在根目錄下須要新建 Gulpfile.js;同時須要安裝依賴包gulp和gulp-webpack,執行命令:npm install gulp gulp-webpack --save-devchrome
所以咱們這邊Gulpfile.js的源碼以下:
var gulp = require('gulp'); var webpack = require("gulp-webpack"); var webpackConfig = require("./webpack.config.js"); gulp.task('webpack', function () { var myConfig = Object.create(webpackConfig); return gulp .src('./js/index.js') .pipe(webpack(myConfig)) .pipe(gulp.dest('./build')); }); // 註冊缺省任務 gulp.task('default', ['webpack']);
而後修改一下webpack.config.js代碼,只須要將output中push屏蔽掉,以下所示:
output: { filename: "build.js" // path: BUILD_PATH },
便可,而後再在命令行中輸入gulp便可生成build/build.js和index.html了,以下所示:
//es6的語法 let LOADER = true; //module.exports = LOADER; class Project { constructor(name) { this.name = name; } start() { return "Project " + this.name + " starting"; } } var project = new Project("Journal"); let projectName = project.start(); // "Project Journal starting" module.exports = "安裝es6語法輸出:"+LOADER+","+projectName;
src/js/index.js,執行入口,用於輸出es6代碼結果,代碼以下:
var aMoudle = require('./a'); console.log(aMoudle);
如今咱們能夠在webpack.config.js裏面moudle.loaders配置加載器了,代碼以下:
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); //定義了一些文件夾的路徑 var ROOT_PATH = path.resolve(__dirname); var SRC_PATH = path.resolve(ROOT_PATH, 'src'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { entry: SRC_PATH + "/js/index.js", output: { filename: "build.js", path: BUILD_PATH }, module: { loaders: [ {test: /\.js$/, loader: 'babel'} ] }, resolve: { extensions: ['', '.js', '.jsx'] }, plugins: [ new HtmlwebpackPlugin({ title: 'Hello babel-loader', filename: 'index.html', inject: true, hash: true }) ] };
最後生成的build/index.html代碼以下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello babel-loader</title> </head> <body> <script type="text/javascript" src="build.js?906bc2a0e6ca45cdeddd"></script></body> </html>
index.html在控制檯的打印效果爲:
webpack
後,可使用
webpack
這個命令行工具。主要命令:
webpack <entry> <output>
。能夠切換到包含webpack.config.js的目錄運行命令:
咱們下面來了解下 webpack -w,以下所示:
好比我在js文件裏面隨便增長一點代碼後,保存後,再刷新頁面便可能夠看到代碼生效了,無需從新運行webpack或者gulp,使用webpack -w 能夠實時打包。
webpack -p 的含義是對進行打包後的文件進行壓縮代碼;好比我在以前使用chrome看打包後的代碼以下:
如上能夠看到,代碼是未壓縮的,可是當我在控制檯命令行中運行 webpack -p 命令後,以下所示:
當我運行如上所示後,咱們再來看看剛纔已經壓縮後的代碼變成什麼樣子呢?以下所示:
new webpack.optimize.UglifyJsPlugin({ //壓縮代碼 compress: { warnings: false }, except: ['$super', '$', 'exports', 'require'] //排除關鍵字 })
這裏須要注意的是壓縮的時候須要排除一些關鍵字,不能混淆,好比$或者require,若是混淆的話就會影響到代碼的正常運行。
webpack.config.js代碼改成以下:
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); var webpack = require("webpack"); module.exports = { entry: { 'index':'./src/index.js' }, output: { path: path.resolve(__dirname, "./build"), filename: "[name].js" }, module: { loaders: [ {test: /.css$/, loader: 'style!css'} ] }, //添加咱們的插件 會自動生成一個html文件 plugins: [ new HtmlwebpackPlugin({ title: 'inner plugin:UglifyJsPlugin', filename: 'index.html', inject: true, hash: true, minify:{ //壓縮HTML文件 removeComments:true, //移除HTML中的註釋 collapseWhitespace:true //刪除空白符與換行符 } }), new webpack.optimize.UglifyJsPlugin({ //壓縮代碼 compress: { warnings: false }, except: ['$super', '$', 'exports', 'require'] //排除關鍵字 }) ] }
根據外部組件html-webpack-plugin中minify進行代碼壓縮,主要是針對index.html,用於清除裏面的註釋、空白符與換行符等。結果以下:
壓縮js和css項目的源碼地址:http://download.csdn.net/detail/wdlhao/9613216
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); //定義了一些文件夾的路徑 var ROOT_PATH = path.resolve(__dirname); var SRC_PATH = path.resolve(ROOT_PATH, 'src'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { entry: SRC_PATH + "/js/index.js", output: { path: BUILD_PATH, filename: 'index.js'//輸出的文件名 合併之後的js會命名爲index.js }, //添加咱們的插件 會按要求自動生成一個html文件 module: { loaders: [ {test: /.less$/, loader: "style!css!less"} ] }, plugins: [ new HtmlwebpackPlugin({ title: 'Hello World app'//生成新的html頁面的title; }) ] };
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello World app</title> </head> <body> <script type="text/javascript" src="index.js"></script></body> </html>
標題title就是咱們配置上的;且合併了依賴的js文件;咱們能夠直接在本地訪問index.html 能夠看到能打印出依賴的文件js代碼了;能夠看到能夠解決依賴的問題;
html-webpack-plugin 還支持以下配置:
plugins: [ new HtmlwebpackPlugin({ favicon:'./src/img/favicon.ico', //favicon路徑 title: 'Hello World app',//生成新的html頁面的title; filename: 'home/home.html', inject: true, hash: true }) ]
而後再在命令行中繼續運行webpack命令,能夠看到在build下會生成2個目錄, 第一個是home/home.html; 第二個是 index.js
再來看下home.html代碼以下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello World app</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <script type="text/javascript" src="../index.js?f19ff1a103d13247bfb5"></script></body> </html>
咱們發如今body裏面自動添加了外鏈的js文件而且該js文件帶有惟一的hash編碼,hash編碼能夠更好的實現js文件的緩存,加快渲染速度。
webpack-html-webpack-plugin(default)源碼地址爲:http://download.csdn.net/detail/wdlhao/9613219
minify是用來壓縮和清潔html代碼
在webpack.config.js中添加,代碼以下:
plugins: [ new HtmlwebpackPlugin({ favicon:'./src/img/favicon.ico', //favicon路徑 title: 'Hello World app',//生成新的html頁面的title; filename: 'home/home.html', inject: true, hash: true, minify:{ //壓縮HTML文件 removeComments:true, //移除HTML中的註釋 collapseWhitespace:true //刪除空白符與換行符 } }) ]
查看html生成後的文件能夠看到已經被壓縮了,形式上變成一行了。如圖:
webpack-html-webpack-plugin(minify)源碼地址爲:http://download.csdn.net/detail/wdlhao/9613212
7、理解 extract-text-webpack-plugin(獨立打包樣式文件)
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); var ExtractTextPlugin = require('extract-text-webpack-plugin'); //定義了一些文件夾的路徑 var ROOT_PATH = path.resolve(__dirname); var SRC_PATH = path.resolve(ROOT_PATH, 'src'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { entry: SRC_PATH + "/js/index.js", output: { filename: "build.js", path: BUILD_PATH }, module: { loaders: [ test:/\.less$/, loader: ExtractTextPlugin.extract( 'css?sourceMap!' + 'less?sourceMap' ) ] }, resolve: { extensions: ['', '.js', '.jsx'] }, plugins: [ // 內聯css提取到單獨的styles的css new ExtractTextPlugin("index.css"), new HtmlwebpackPlugin({ title: 'Hello World app', filename: 'index.html', inject: true, hash: true }) ] };
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello World app</title> <link href="index.css?3a51e24a9f1f95dd46e0" rel="stylesheet"></head> <body> <script type="text/javascript" src="build.js?3a51e24a9f1f95dd46e0"></script></body> </html>
entry: { 'index':SRC_PATH + "/js/index.js", 'main':SRC_PATH + "/js/main.js" }, output: { filename: "[name].bundle.js", path: BUILD_PATH },
從上面的配置代碼咱們能夠看到 entry如今變成了一個對象了,而對象名也就是key會做爲下面output的filename屬性的[name]。固然entry也能夠是一個數組。
所以咱們直接 webpack運行下便可 在build文件下 生成2個入口文件 如上面的截圖所示,如今咱們能夠根據不一樣的頁面 引入不一樣的入口文件,實現按需加載文件。
webpack打包多個資源文件源碼地址以下:http://download.csdn.net/detail/wdlhao/9613221
我如今的項目文件結構以下:
圖片是 url-loader來加載的,咱們既能夠在css文件裏url的屬性;
首先先安裝 url-loader插件: npm install --save-dev url-loader
首先在src/js/index.js文件裏面加入以下代碼:
require('../less/main.less');
首先在src/less/main.less文件裏面加入以下代碼:
@color: red; body { background:@color; background:url('../images/1.png') no-repeat; }
var path = require('path'); var HtmlwebpackPlugin = require('html-webpack-plugin'); var webpack = require("webpack"); //定義了一些文件夾的路徑 var ROOT_PATH = path.resolve(__dirname); var SRC_PATH = path.resolve(ROOT_PATH, 'src'); var BUILD_PATH = path.resolve(ROOT_PATH, 'build'); module.exports = { entry: { "index": SRC_PATH + "/js/index.js" }, output: { filename: "[name].js", path: BUILD_PATH }, module: { loaders: [ //.css 文件使用 style-loader 和 css-loader 來處理 { test: /\.less$/, loader:'style!css!less?sourceMap' }, { test: /\.js$/, loader: 'babel' }, { test: /.(png|jpg)$/, loader: 'url?limit=8192&name=images/[hash:8].[name].[ext]'//這種寫法主要是用來設置圖片的存放路徑及圖片的生成名字如,build/images/43243234234.1.png } } ] }, resolve: { extensions: ['', '.js', '.jsx'] }, plugins: [ new HtmlwebpackPlugin({ title: 'Hello World app', filename: 'index.html', inject: true, hash: true }) ] };
執行webpack後,在瀏覽器中查看顯示效果,如圖所示:
至此運用url-loader實現圖片打包,而且可以在css中正確運用打包後的圖片。