源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件

  • 时间:2022-10-29 02:10 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
[b]webpack系列目录[/b] [url=http://www.1sucai.cn/article/117486.htm]webpack 系列 二:webpack 介绍&安装[/url] [url=http://www.1sucai.cn/article/117488.htm]webpack 系列 三:webpack 如何集成第三方js库[/url] [url=http://www.1sucai.cn/article/117490.htm]webpack 系列 四:webpack 多页面支持 & 公共组件单独打包[/url] [url=http://www.1sucai.cn/article/117492.htm]webpack 系列 五:webpack Loaders 模块加载器[/url] [url=http://www.1sucai.cn/article/117495.htm]webpack 系列 六:前端项目模板-webpack+gulp实现自动构建部署[/url] 基于webpack搭建纯静态页面型前端工程解决方案模板, 最终形态源码见github: [url=https://github.com/ifengkou/webpack-template]https://github.com/ifengkou/webpack-template[/url] [b]正文[/b] Webpack将所有静态资源都认为是模块,比如JavaScript,CSS,LESS,TypeScript,JSX,CoffeeScript,图片等等,从而可以对其进行统一管理。为此Webpack引入了加载器的概念,除了纯JavaScript之外,每一种资源都可以通过对应的加载器处理成模块。和大多数包管理器不一样的是,Webpack的加载器之间可以进行串联,一个加载器的输出可以成为另一个加载器的输入。比如LESS文件先通过less-load处理成css,然后再通过css-loader加载成css模块,最后由style-loader加载器对其做最后的处理,从而运行时可以通过style标签将其应用到最终的浏览器环境。 [b]一 常用loader[/b] 安装css/sass/less loader加载器
[url=http://webpack.github.io/docs/stylesheets.html#separate-css-bundle]文档docs点这[/url],[url=https://github.com/webpack-contrib/extract-text-webpack-plugin]插件的github点这[/url] [b]二:extract-text-webpack-plugin 插件介绍[/b] Extract text from bundle into a file.从bundle中提取出特定的text到一个文件中。使用 extract-text-webpack-plugin就可以把css从js中独立抽离出来 安装
$ npm install extract-text-webpack-plugin --save-dev
使用(css为例)
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
 module: {
  loaders: [
   { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader", "css-loader") }
  ]
 },
 plugins: [
  new ExtractTextPlugin("styles.css")
 ]
}
它将从每一个用到了require("style.css")的entry chunks文件中抽离出css到单独的output文件 [b]API[/b] new ExtractTextPlugin([id: string], filename: string, [options]) [list=1] [*]id Unique ident for this plugin instance. (For advanded usage only, by default automatic generated)[/*] [*]filename the filename of the result file. May contain [name], [id] and [contenthash]. [list=1]
  • [name] the name of the chunk[/*] [*][id] the number of the chunk[/*] [*][contenthash] a hash of the content of the extracted file[/*] [/list]
  • [*]options [list=1]
  • allChunks extract fromall additional chunks too (by default it extracts only from the initial chunk(s))[/*] [*]disable disables the plugin[/*] [/list]
  • [/list] ExtractTextPlugin.extract([notExtractLoader], loader, [options]) 根据已有的loader,创建一个提取器(loader的再封装) [list=1] [*]notExtractLoader (可选)当css没有被抽离时,加载器不应该使用(例如:当allChunks:false时,在一个additional 的chunk中)[/*] [*]loader 数组,用来转换css资源的加载器s[/*] [*]options [list=1]
  • publicPath 重写该加载器(loader)的 publicPath 的设置[/*] [/list]
  • [/list] 多入口文件的extract的使用示例:
    let ExtractTextPlugin = require('extract-text-webpack-plugin');
    
    // multiple extract instances
    let extractCSS = new ExtractTextPlugin('stylesheets/[name].css');
    let extractLESS = new ExtractTextPlugin('stylesheets/[name].less');
    
    module.exports = {
     ...
     module: {
     loaders: [
      {test: /\.scss$/i, loader: extractCSS.extract(['css','sass'])},
      {test: /\.less$/i, loader: extractLESS.extract(['css','less'])},
      ...
     ]
     },
     plugins: [
     extractCSS,
     extractLESS
     ]
    };
    
    
    [b]三:改造项目-抽离css[/b] 安装插件到项目
    npm install extract-text-webpack-plugin --save-dev
    配置webpack.config.js,加入ExtractTextPlugin和相关处理:
    var webpack = require("webpack");
    var path = require("path");
    var srcDir = path.resolve(process.cwd(), 'src');
    var nodeModPath = path.resolve(__dirname, './node_modules');
    var pathMap = require('./src/pathmap.json');
    var glob = require('glob')
    var CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin;
    var HtmlWebpackPlugin = require('html-webpack-plugin');
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    var entries = function () {
     var jsDir = path.resolve(srcDir, 'js')
     var entryFiles = glob.sync(jsDir + '/*.{js,jsx}')
     var map = {};
    
     for (var i = 0; i < entryFiles.length; i++) {
      var filePath = entryFiles[i];
      var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
      map[filename] = filePath;
     }
     return map;
    }
    
    var html_plugins = function () {
     var entryHtml = glob.sync(srcDir + '/*.html')
     var r = []
     var entriesFiles = entries()
     for (var i = 0; i < entryHtml.length; i++) {
      var filePath = entryHtml[i];
      var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'));
      var conf = {
       template: 'html!' + filePath,
       filename: filename + '.html'
      }
      //如果和入口js文件同名
      if (filename in entriesFiles) {
       conf.inject = 'body'
       conf.chunks = ['vendor', filename]
      }
      //跨页面引用,如pageA,pageB 共同引用了common-a-b.js,那么可以在这单独处理
      //if(pageA|pageB.test(filename)) conf.chunks.splice(1,0,'common-a-b')
      r.push(new HtmlWebpackPlugin(conf))
     }
     return r
    }
    var plugins = [];
    var extractCSS = new ExtractTextPlugin('css/[name].css?[contenthash]')
    var cssLoader = extractCSS.extract(['css'])
    var sassLoader = extractCSS.extract(['css', 'sass'])
    
    plugins.push(extractCSS);
    
    plugins.push(new CommonsChunkPlugin({
     name: 'vendor',
     minChunks: Infinity
    }));
    
    module.exports = {
     entry: Object.assign(entries(), {
      // 用到什么公共lib(例如jquery.js),就把它加进vendor去,目的是将公用库单独提取打包
      'vendor': ['jquery', 'avalon']
     }),
     output: {
      path: path.join(__dirname, "dist"),
      filename: "[name].js",
      chunkFilename: '[chunkhash:8].chunk.js',
      publicPath: "/"
     },
     module: {
      loaders: [
       {
        test: /\.((woff2?|svg)(\?v=[0-9]\.[0-9]\.[0-9]))|(woff2?|svg|jpe?g|png|gif|ico)$/,
        loaders: [
         //小于10KB的图片会自动转成dataUrl,
         'url?limit=10000&name=img/[hash:8].[name].[ext]',
         'image?{bypassOnDebug:true, progressive:true,optimizationLevel:3,pngquant:{quality:"65-80",speed:4}}'
        ]
       },
       {
        test: /\.((ttf|eot)(\?v=[0-9]\.[0-9]\.[0-9]))|(ttf|eot)$/,
        loader: 'url?limit=10000&name=fonts/[hash:8].[name].[ext]'
       },
       {test: /\.(tpl|ejs)$/, loader: 'ejs'},
       {test: /\.css$/, loader: cssLoader},
       {test: /\.scss$/, loader: sassLoader}
      ]
     },
     resolve: {
      extensions: ['', '.js', '.css', '.scss', '.tpl', '.png', '.jpg'],
      root: [srcDir, nodeModPath],
      alias: pathMap,
      publicPath: '/'
     },
     plugins: plugins.concat(html_plugins())
    }
    
    
    其中,用ExtractTextPlugin 来抽离css
    var ExtractTextPlugin = require('extract-text-webpack-plugin');
    var extractCSS = new ExtractTextPlugin('css/[name].css?[contenthash]')
    var cssLoader = extractCSS.extract(['css'])
    var sassLoader = extractCSS.extract(['css', 'sass'])
    
    plugins.push(extractCSS);
    ......
    //conf - module - loaders
    {test: /\.css$/, loader: cssLoader},
    {test: /\.scss$/, loader: sassLoader}
    
    
    注意事项: css中img的路径会出现问题,通过设置publicPath 解决,采用绝对路径
    output: {
     ......
     publicPath: "/"
    },
    运行: $ webpack [b]期望[/b] [list=1] [*]css单独抽离,打包成单独的css文件[/*] [*]html自动引用css文件[/*] [*]小于10k的图片,转成base64 格式的 dataUrl[/*] [*]webpack.png 会被压缩,减少文件大小[/*] [/list] 运行webpack后的项目的目录结构:  [img]http://files.jb51.net/file_images/article/201706/2017062915030132.png[/img] 生成的 dist/index.html 自动引用了 index.css 和相关的js,由于设置了publicPath 所以相应的链接都采用了绝对路径 [img]http://files.jb51.net/file_images/article/201706/2017062915030133.png[/img] 生成的 dist/index.css 小图片被转成了data:image形式: [img]http://files.jb51.net/file_images/article/201706/2017062915030134.png[/img] [b]结果: [/b] [list=1] [*]css单独打包到css目录[/*] [*]html自动注入了link 标签[/*] [*]small-webpack.png 小于10k,被打包进了index.css[/*] [*]webpack.png 由原来的50+k 被压缩成 10- k[/*] [/list] 最后,运行 webpack-dev-server 看一下运行结果: [img]http://files.jb51.net/file_images/article/201706/2017062915030135.png[/img] [b]总结[/b] Webpack将所有静态资源都认为是模块,而通过loader,几乎可以处理所有的静态资源,图片、css、sass之类的。并且通过一些插件如extract-text-webpack-plugin,可以将共用的css抽离出来 下篇介绍改进webpack.config.js: [list=1] [*]区分开发环境和生产环境[/*] [*]集成 gulp 实现自动构建打包部署[/*] [*]github 发布 前端自动化构建的项目模板[/*] [/list] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
    • 全部评论(0)
    联系客服
    客服电话:
    400-000-3129
    微信版

    扫一扫进微信版
    返回顶部