精华内容
下载资源
问答
  • 懒加载或者按需加载,是一种很好的优化网页或应用的方式。这种方式实际上是先把你的代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或即将引用另外一些新的代码块。这样加快了应用的初始...

    T> 本指南的继承自代码分离。如果你尚未阅读该指南,请先行阅读。

    懒加载或者按需加载,是一种很好的优化网页或应用的方式。这种方式实际上是先把你的代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或即将引用另外一些新的代码块。这样加快了应用的初始加载速度,减轻了它的总体体积,因为某些代码块可能永远不会被加载。

    示例

    我们在代码分离中的例子基础上,进一步做些调整来说明这个概念。那里的代码确实会在脚本运行的时候产生一个分离的代码块 lodash.bundle.js ,在技术概念上“懒加载”它。问题是加载这个包并不需要用户的交互 -- 意思是每次加载页面的时候都会请求它。这样做并没有对我们有很多帮助,还会对性能产生负面影响。

    我们试试不同的做法。我们增加一个交互,当用户点击按钮的时候用 console 打印一些文字。但是会等到第一次交互的时候再加载那个代码块(print.js)。为此,我们返回到代码分离的例子中,把 lodash 放到主代码块中,重新运行_代码分离_中的代码 final Dynamic Imports example。

    project

    webpack-demo

    |- package.json

    |- webpack.config.js

    |- /dist

    |- /src

    |- index.js

    + |- print.js

    |- /node_modules

    src/print.js

    console.log('The print.js module has loaded! See the network tab in dev tools...');

    export default () => {

    console.log('Button Clicked: Here\'s "some text"!');

    }

    src/index.js

    + import _ from 'lodash';

    +

    - async function getComponent() {

    + function component() {

    var element = document.createElement('div');

    - const _ = await import(/* webpackChunkName: "lodash" */ 'lodash');

    + var button = document.createElement('button');

    + var br = document.createElement('br');

    + button.innerHTML = 'Click me and look at the console!';

    element.innerHTML = _.join(['Hello', 'webpack'], ' ');

    + element.appendChild(br);

    + element.appendChild(button);

    +

    + // Note that because a network request is involved, some indication

    + // of loading would need to be shown in a production-level site/app.

    + button.onclick = e => import(/* webpackChunkName: "print" */ './print').then(module => {

    + var print = module.default;

    +

    + print();

    + });

    return element;

    }

    - getComponent().then(component => {

    - document.body.appendChild(component);

    - });

    + document.body.appendChild(component());

    W> 注意当调用 ES6 模块的 import() 方法(引入模块)时,必须指向模块的 .default 值,因为它才是 promise 被处理后返回的实际的 module 对象。

    现在运行 webpack 来验证一下我们的懒加载功能:

    Hash: e0f95cc0bda81c2a1340

    Version: webpack 3.0.0

    Time: 1378ms

    Asset Size Chunks Chunk Names

    print.bundle.js 417 bytes 0 [emitted] print

    index.bundle.js 548 kB 1 [emitted] [big] index

    index.html 189 bytes [emitted]

    [0] ./src/index.js 742 bytes {1} [built]

    [2] (webpack)/buildin/global.js 509 bytes {1} [built]

    [3] (webpack)/buildin/module.js 517 bytes {1} [built]

    [4] ./src/print.js 165 bytes {0} [built]

    + 1 hidden module

    Child html-webpack-plugin for "index.html":

    [2] (webpack)/buildin/global.js 509 bytes {0} [built]

    [3] (webpack)/buildin/module.js 517 bytes {0} [built]

    + 2 hidden modules

    框架

    许多框架和类库对于如何用它们自己的方式来实现(懒加载)都有自己的建议。这里有一些例子:

    展开全文
  • 也许你看到这个标题第一个想法就是,这不是 h5 同事去做的事吗,直接给个 url 地址,我们直接加载就行了。但是这个是根据业务情况来的,很多情况下加载的是 html 的代码片段,而不是 url地址。在我们项目中,很多...

    也许你看到这个标题第一个想法就是,这不是 h5 同事去做的事吗,直接给个 url 地址,我们直接加载就行了。但是这个是根据业务情况来的,很多情况下加载的是 html 的代码片段,而不是 url地址。

    在我们项目中,很多情况是课程的介绍还有文章的详情都是加载的Html 片段。在后台管理系统编辑的时候通过通用的插件使其插入图片及其他元素,存在数据库里的时候就是其里面的一个字段。展示如下图:

    image.png因为我们业务页面大多数都是放的图片,如果图片过多或者过得大,用户体验的话很差,必须等着全部加载完才能展示。用户网络不好的话需要等很长时间。所以需要进行优化。

    优化开启

    因为是两个安卓跟 IOS 端都要优化,IOS 同事仿微信图片懒加载先做的差不多了,我这边又在其基础上做了些优化。安卓的话搜的资料倒不是很多,好在跟 IOS 都异曲同工吧算是。

    先说一下实现思路吧:

    本地加载基于 jquery的懒加载的 js 文件,加载进行展示

    相关文件如下:

    下载地址:https://github.com/xinghedazhan/lazyload/tree/master

    image.png1.配置 js 文件

    将两个 js 文件放在项目目录的assets目录下

    因为加载Html 的代码片段是自己添加网页的头跟尾的,所以在头里面添加两个 js 文件的引用。

    " "

    " "

    2.添加 js方法调用

    "

    "jQuery(document).ready(" +

    "function(){" +

    "$(\"img\").lazyload({" +

    "placeholder : 'data:image/gif;base64,R0lGODlh/AF9AbMAAP///+7u7t3d3czMzLu7u6qqqpmZmYiIiHd3d2ZmZv4BAgAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAKACwAAAAA/AF9AQAE/xDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru987//AoHBILBqPyKRyyWw6n9CodEqtWq/YrHbL7Xq/4LB4TC6bz+i0es1uu9/wuHxOr9vv+Lx+z+/7/4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/AAMKHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIP9DihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6CRBhhAekCAAKHjBCiA4MABAwUICDid2k2BBLgRtDYwQEDtNgEQ4B6eALbv32sECB/OG7mb4MMPoHbuZnlx6m9u4y6A/Tnz7rYT6J4Ofo1uBNzLrwmu+7j6NATOv18T//UJ8vOfsEZvgnZ+KAW4ZkD/f/7910R96ZFwGn4GKjGAawcQyGCDSAQAoXsiLEhhExASoGAAs23IBAGvGTBhBwLMdqKIRFhogAEehgBiiiyO+CKMIMwYYo1LFHBjjByMliKGPFZ4Y2wcCEAajUUysRpsBRRgmgUgltZbk04EQACUURJgJQFglkYklksMEGVssYGpZmkrkukgAWmqGeaYbj4x45Jt1qnnnnz26eefgAYq6KCEFmoonwXqoKEEix5aQQAv5inDiwNMQKmjVEbKw6UScIrpBJCauGlzjEpKaKimwuDppxegGqScGIwGK5UDgOmbp6RNp6RvAqg5oayyAZBrka5qsOWNqwJwLLIGYCgA/7PHVtopqVuCyayzzPpIao3FYnCsl8u6N8CLXpp5I6gvSjnujdICwOmy4J7LaLqkIdsui91a8Gyz6L5o6bbKagqAj0CGuu27L7p37HQE9wuwiPlWsGWCEuyr673CahoqtgdT6+8EFgOwMQX7YrxhxBQk6+7Dp9WqLWr7WuApwkCKrGnMFahMIcr/mowrszeitq7MHUtbLQWuDp3zwycLfIHKCP9orahKp1y0BEf3K/THVpu8s9NE12wzv6FOKcG6MIO9crs0I30z2GUTqzYFx1agdNVYa7xqyT3nXXOx5FKwrtcN8lxxuv3GuK64QefNr8jasu3x3wJHe/iqiTYqcv+qmRkMtMfkaivq2LAty6nBsdnbd8CUj+45s+3i7anhnb0O+wTr/ojfvj+uDCTvkc48uduji7xsAXGfzfXaWju34POai8xmq9NvzqCS0mZOXvSJljpdwqBq/yjnrH4AKfLEk18+DKGiDzls6wNhOrLqxw9D7uTWb38M0e/v//8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygBCdIwQpa8IIYzKAGN8jBDnrwgyAMoQhHSMISmvCEKEyhClfIwha68IUwjKEMZ0jDGtrwhjjMoQ53yMMe+vCHQAyiEIdIxCIa8YhITKISl8jEJjrxiVCMohSnSMUqWvGKWMyiFrfIxS5OevGLYAyjGMdIxjKa8YxoTKMa18jGNrrxjXCMoxznSMc62vGOeMyjHvfIxz768Y+ADKQgB0nIQhrykIhMpCIXychGOvKRkIykJCepkAgAACH5BAUKAAoALO0AngAdAB4AAAS6UMlJJSHmXFG7n0koJogWfKgyjqUxpNKhINRhHyJiEO93IjREgVMJGHQEAbFzAOpggUFg6mkCC7AsoanJZrle7S0MuxHIqdsJ7RkcMuyP24CNUwASw84+AeAxe3wKfgADemeChAJ6BomECoxrdo8FdD1xhHgDBZx4cVOZnHWfAZ4Km5yXYVOlFAQFG2SskhOvF6o+AqwfF70CphQBSrq0Hr2+wwPDSsUeAscD0dLLaAIDPNLRzHxT2zARACH5BAUKAAoALO0AnwAdAB0AAAS1UMk5yUEYp40K/SCBXBmiIFvqgZ9xXLAhG2iaIAErue9BsIKCDcfiHVY6ySFFpLhcv6STc2jJpMWbTwEAzKLYz/JgkAxmYVYgYSAIFIVrmkUYCN6G+DwZCAThe1gFBWCBIYOGSQOIiUCEjTqEhZASBJaUH5aTlAKakF1dlZYDiaChCp2Wb3umpwoDo6ytrQOkdmmzs7W7OgB9Abm6u3Z3v8bAs2q7d8x+xgB7fszFv9Clx9ZJEQAh+QQFCgAKACztAJ4AHgAeAAAEuRDISUEYpBQyRP2gRRhHaSIHQgQhOBgwaaYpghTtFBRxrGk0m40V2vVWHwHBlhiCdjwDIWcxIBJNTyVjKAyok8K1WRn8vuAwNoELa6ZpimFNxGjilcDaIMlw8BUFWAgiBEiAEwJrAkqGiBVrBI1ojxIHWByGlJWXNxh/lZYokpqhEjwFAgGZphICAwEXA7CtAFqzHbVEr7O1FLhavrK0vraMqsXGjES+x8vFy6qx06bT1izMldfZyXgRACH5BAUKAAoALO0AngAeAB0AAAS+UMlJpRiEDBWq/wowFKRhngaoKmRZoOZxEOuUtWSWxYacrjdCYQOSGVU6Wo0lQxw6FUxmaWseKgKdgGpzIpQSHZErKSDOky2GXDkjCpLBZsumoEPycV1yD+T3dhN+A3SACj8KF4SGEikJBoqFgAYJjwECmIwKB5U0mJJ7lQkEAJ8AhgOiHZ9QewWVCBKXmXsBonCyAgGtZJRnvLu8VAFOMxXBwksCBWAUyGx+ybLBAKdL0hTV2tvWgNzfjOBcEQAh+QQFCgAKACztAJ4AHgAdAAAEuRDISUEQYgwcqv+SQIxjQRToAIIi6aKwoa7TQNikdseGUXQrDU4ApAQGhV6vWBFuaBaC0sAMCQXQiVRZOWqwWa3hcCBQMM8wJUkGXjDqLrkc4sQrhHkdfJ8IyAgBb3x9EgcIBwOCRIVrCAgEgoKNE2MIP5KUEgaPBhaTmpyQn1V9j6OZlAKPCW6lcQUICQhdjQGyCQWaFAYJvq99Bb65uxLCvrS7AQfDgZoBx8iEjYeyzspSdMUXN8ARACH5BAUKAAoALO0AngAeAB4AAAS0EMhJZQgi38q7FUM4ECQ5eB4GisRYkgJKZZlYuy8RyDS4VQFXoaBL9WQS0rCwA6qaSMBgSeBcBNCodGg4TS4/7YRgKBgoYDGncOha0moK2XB+xysCumHHv1f0Xn4cc4GCcgcHVYYVZgcFi4yIhZCIB5OGApUxkEkHCAecFp6OoQAGnwhZhgQIrYqQBa2fnAGnsqpxUwkICbu4MgGVB73EvmoYrMXFj8cgbLzECEyCGFNERTIRACH5BAUKAAoALO4AngAdAB4AAASrEMhJQbi46i2x+N8gChzngaE4lhR2Ca+gzqzlboE8EDyb1TseoRSoUQTCodGI5JGWQCHUKBxMWbuC8ooreIvcjbfwDFcIXqv57N2uJQSD9k2JG9R0gGFffgf2BmB0dgZ5FoBuawUGBwctZgSNB245MoVLkY2XFFkIB4Jdkp8aAZEICQkGfRJInp6jOAanqKgHgAi4B7mgGwSztKinuLiJRLLAtMS8S017TjURACH5BAUKAAoALO0AngAeAB4AAAS2EMhJa6g4axC671s4fZ1gXmJGBmYrpDDrwrA5DC8tBveti4Je7qcJ+oibG2GIrAgIhEFTBSWgppQqEwsYQAVXrjcK4nahA5lZG6hyCYVloFA4bHVz+sVwQBimA3QEEgMICAlhOnQFUhyHCQdIcAYFWQmXfzqTjBWPCZUwBAajoBQCngeJFqKjBqqOlwkIBXdtraOvEgGehn4FlAfBwbgpBbG9CH3CwYM0AQbIycnMuUBQlFF3FREAIfkEBQoACgAs7QCeAB4AHgAABLwQyEmrvTjrzWfoYCCKIDeSpXZ+FpuKAuq5r2DTQ5x6tjAJhAEt1WMRCgTfThLoAQIGw0G5BAyu1gMCUZ1chYTtoSsRXKGIxJhszhkSajKgDYSvu2ZCgABPyAlBNn1UO3uAEmkJBXiABBIFfUMgjUoBfQZLA40UkAkIiyWagIQAW1ugHANIhxUBpggGkhVHBUiyrmIISS2qtbYZAVoIB8QHSEhRUbV6HGHFxcnKBgMle88H0QXUVQFXtWcbEQAh+QQFCgAKACztAJ8AHgAdAAAEuhDIOUOgOGsqhtjgFhDEcIWoFBhGYaZocMwGAaMHots3WCRAQ6+CCQATh6HKcgL8gM0hc4IIKitTI3BwxV4Ix+5EYAGAkWKVgGywpgNrmVsMJ4MRwvTaXkWkAXtwOghRUgMeEoM8Vx2ITjoHhTeHLwABCDkFjJQUBJgHizACJY4TMzOhIaMDJRkypwWSGKwkXBqvBywEH0W0JKlFLLksNb8EBcbAGgTELAXPz8ckvDfMzi3QrV1wtHEoEQA7'," + /* 占位图 */

    "threshold : 50," + /* 距离图片多少的位置处开始下载 */

    "failure_limit : 10," + /* 最大不在加载范围图片数, 主要是瀑布流布局时设置 */

    "effect: \"fadeIn\"," + /* 图片加载方式 */

    "skip_invisible : true" +

    "});" +

    "});" +

    "" +

    看方法的含义应该是网页框架加载完毕的时候再进行的图片的懒加载。placeholder代表的是占位图,就是我放的是holder.gif的二进制字符串,当时以为时间紧还有文件也不大,直接就用的二进制了。有想法的可以放本地加载引用试试。

    3.替换 img标签的 src 属性

    因为jquery的懒加载框架的加载不是用普通的 src 属性来加载的,需要替换成data-original,同时还要考虑 Video 跟 Audio 等标签里面的 src 属性不能替换,故写了个匹配替换方法如下:

    /**

    * 变img标签里面的 src 属性为 data-original

    */

    public static String takeImgSrc(String htmlStr) {

    String line=htmlStr;

    String itemStr="";

    String pattern = "";

    // 创建 Pattern 对象

    Pattern r = Pattern.compile(pattern);

    // 现在创建 matcher 对象

    Matcher m = r.matcher(line);

    while (m.find()){

    if (m.group(0)!=null){

    if (m.group(0).contains("src")){

    itemStr = m.group(0).replace("src","data-original");

    line = line.replace(m.group(0), itemStr);

    }

    }

    }

    return line;

    }

    至此应该可以实现仿微信的 lazyload 了。不足的地方欢迎大家指正,共同进步

    展开全文
  • 一写dll需要建立至少三个文件:1 .cpp文件用于写核心代码。里面包括一个dll入口函数DllMain。形如:包括需要导出的变量和函数,图中的是add。以及不需要导出的变量和函数。2 .h文件用于供其他程序调用使用。最好包括...

    一写dll需要建立至少三个文件:

    1 .cpp文件用于写核心代码。

    里面包括一个dll入口函数DllMain。形如:

    5b1116600507b2d478151b0ec2c42d82.png

    包括需要导出的变量和函数,图中的是add。以及不需要导出的变量和函数。

    2 .h文件用于供其他程序调用使用。

    最好包括如下内容:

    96cf9d1b0be69b3e39ed24695466ca0d.png

    3 .def文件,用于为链接器提供有关被链接程序的导出、属性及其他方面的信息。为了导出所需函数。

    如图:

    01f2af025f6637393d00c32f31e21bb6.png

    .def文件的规则为:

    (1)LIBRARY语句说明.def文件相应的DLL,可以省略;

    (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n;

    (3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

    可以看出,DLL中导出函数的声明有两种方式:

    一种方式是:在函数声明中加上__declspec(dllexport);

    另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

    这两种方式分别对应上面的2和3,笔者建议这两个文件全部建立。

    二编译后生成三个有用的文件:

    • 1.dll文件就是动态链接库
    • 2.lib文件就是供程序开发用的导入库,它为系统提供了加载这个dll和定位dll中的导出函数所需的信息。
    • 3.h文件包含了导出函数的声明

    三使用dll有两种途径

    1装载期间动态链接。这时候需要用到全部三个有用文件。最好将他们都放入你的工程目录。

    在调用时必须要用到两个语句,他们是:

    #include “.h”有用文件

    #pragma comment(lib, “.lib”有用文件)

    之后就可以像使用本地函数一样使用.dll中的导出函数了。请看下面的例子:

    51513dff657420a0c55150de2081a2bd.png

    2运行期间动态链接。这时候只需要用到.dll文件。你需要记录它的文件目录中的地址。

    这时你需要用到三个函数:

    用于加载库的:库handle = LoadLibrary("dll文件的目录地址");

    用于加载函数:函数指针 = GetProcAddress(库handle, "函数名");

    用于释放库的:FreeLibrary(库handle);

    在加载函数指针后就可以使用这个函数了。请看下面的例子:

    9955a6c49795ca80062de8be26d94e35.png
    072ed0effcac337c3e77f31f1e544f7b.png
    展开全文
  • 除了的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度。下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要一些dev-tools,dev-server和jshint校验等,将与开发...

    除了的webpack基本配置,还可以进一步添加配置,优化合并文件,加快编译速度。下面是生产环境配置文件webpack.production.js,与wenbpack.config.js相比其不需要一些dev-tools,dev-server和jshint校验等,将与开发相关的东西删掉。下面的介绍均以此代码配置作参考。

    /*生成环境配置文件:不需要一些dev-tools,dev-server和jshint校验等。和开发有关的东西删掉*/

    var webpack = require('webpack');

    var path = require('path');

    var node_modules = path.resolve(__dirname, 'node_modules');

    var pathToReact = path.resolve(node_modules, 'react/dist/react.min.js');

    var pathToReactDOM = path.resolve(node_modules, 'react-dom/dist/react-dom.min.js');

    var ExtractTextPlugin = require('extract-text-webpack-plugin');

    var HtmlWebpackPlugin = require('html-webpack-plugin');

    //具体作用及缺点见plugins中的描述

    //var WebpackMd5Hash = require('webpack-md5-hash');

    // 该插件是对“webpack-md5-hash”的改进:在主文件中获取到各异步模块的hash值,然后将这些hash值与主文件的代码内容一同作为计算hash的参数,这样就能保证主文件的hash值会跟随异步模块的修改而修改。

    var WebpackSplitHash = require('webpack-split-hash');

    var config = {

    entry:{

    app:path.resolve(__dirname, 'src/js/entry.js'),

    mobile: path.resolve(__dirname, 'src/js/mobile.js'),

    //添加要打包在vendors.js里面的库

    vendors:['react','react-dom']

    },

    resolve:{

    alias: {

    'react.js': pathToReact, //alias:别名,

    'react-dom.js': pathToReactDOM

    },

    fallback: path.join(__dirname, "node_modules")

    },

    resolveLoader: {

    fallback: path.join(__dirname, "node_modules")

    },

    output:{

    path:path.resolve(__dirname, 'dist'),

    publicPath:'../',//生成的html里的引用路径用 publicPath

    //以文件内容的MD5生成Hash名称的script来防止缓存

    filename: 'js/[name].[chunkhash:8].js',

    //异步加载的模块是要以文件形式加载,生成的文件名是以chunkFilename配置的

    chunkFilename: 'js/[name].[chunkhash:8].js'

    },

    module:{

    loaders:[{

    test: /\.jsx?$/,

    //这里(node_modules文件夹)再也不需通过任何第三方来加载

    exclude:path.resolve(__dirname, 'node_modules'),

    loader: 'babel',

    query:{

    presets:['es2015', 'react']

    }

    },

    {

    test:/\.css$/,

    //loader:'style!css'

    loader: ExtractTextPlugin.extract("style", "css")

    },

    {

    test:/\.scss$/,

    loader:'style!css!sass'

    },

    //url-loader:图片、字体图标加载器,是对file-loader的上层封装,支持base64编码。传入的size(也有的写limit) 参数是告诉它图片如果不大于 25KB 的话要自动在它从属的 css 文件中转成 BASE64 字符串。

    {

    test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot)$/,

    loader: 'url?limit=25000&name=[name].[ext]'

    }]

    },

    plugins:[

    //提取公共代码的插件,用于提取多个入口文件的公共脚本部分,然后生成一个vendors.js。注意HTML代码中要加载这个公共文件

    new webpack.optimize.CommonsChunkPlugin({

    name: 'vendors',

    filename: 'js/vendors.js'

    }),

    //在文件开头插入banner

    new webpack.BannerPlugin("The file is creted by yangmin.--"+ new Date()),

    //压缩js文件

    new webpack.optimize.UglifyJsPlugin({

    compress: {

    warnings: false

    }

    }),

    /*插件:单独使用style标签加载css文件.contenthash代表的是文本文件内容的hash值,也就是只有style文件的hash值*/

    new ExtractTextPlugin("css/[name].[contenthash:8].css"),//设置其路径(路径相对于path)

    /*插件:动态生成html,在webpack完成前端资源打包以后,自动将打包后的资源路径和版本号写入HTML中,达到自动化的效果。*/

    new HtmlWebpackPlugin({

    filename:'view/index.html', //生成的html存放路径,相对于 path

    template:'src/view/index.html', //html模板路径

    inject:true, //允许插件修改哪些内容,true/'head'/'body'/false,

    chunks:['vendors','app'],//加载指定模块中的文件,否则页面会加载所有文件

    hash:false, //为静态资源生成hash值

    minify:{ //压缩HTML文件

    removeComments:false, //移除HTML中的注释

    collapseWhitespace:false //删除空白符与换行符

    }

    }),

    new HtmlWebpackPlugin({

    filename:'view/mobile.html', //生成的html存放路径,相对于 path

    template:'src/view/mobile.html', //html模板路径

    inject:true, //允许插件修改哪些内容,true/'head'/'body'/false,

    chunks:['vendors','mobile'],//加载指定模块中的文件,否则页面会加载所欲文件

    hash:false, //为静态资源生成hash值

    minify:{ //压缩HTML文件

    removeComments:false, //移除HTML中的注释

    collapseWhitespace:false //删除空白符与换行符

    }

    }),

    /*作用:生成具有独立hash值的css和js文件,即css和js文件hash值解耦.

    *缺点:webpack-md5-hash插件对chunk-hash钩子进行捕获并重新计算chunkhash,它的计算方法是只计算模块本身的当前内容(包括同步模块)。这种计算方式把异步模块的内容忽略掉了,会造成一个问题:异步模块的修改并未影响主文件的hash值。

    */

    //new WebpackMd5Hash()

    new WebpackSplitHash()

    ]

    }

    module.exports = config;

    一、在开发环境中使用压缩文件

    例如ReactJS项目中为了不让 Webpack 去遍历 React JS 及其所有依赖,你可以在webpack.config.js中重写它的行为。

    config.alias: 每当 "react" 在代码中被引入,它会使用压缩后的 React JS 文件。

    noParse: 阻止Webpack 去解析那个压缩后的文件。

    当加载多个压缩文件时,下述方法更优雅简便,webpack.production.js:

    var webpack = require("webpack");

    ...

    var HtmlWebpackPlugin = require('html-webpack-plugin');

    var deps = [

    'react/dist/react.min.js',

    'react-dom/dist/react-dom.min.js'

    ];

    var config = {

    ...

    resolve:{

    alias:{},

    fallback:path.join(__dirname, "node_modules")

    },

    ...

    module:{

    ...

    noParse:[]

    }

    }

    /*当加载多个压缩文件时,下述方法更优雅简便*/

    deps.forEach(function(dep){

    var depPath = path.resolve(node_modules, dep);

    //path.dep是路径分隔符。

    config.resolve.alias[dep.split(path.dep)[0]] = depPath;

    config.module.noParse.push(depPath);

    });

    module.exports = config;

    二、分离应用和第三方文件

    当你的应用依赖其他库尤其是像 React JS 这种大型库的时候,需要考虑把这些依赖分离出去,这样就能够让用户在你更新应用之后不需要再次下载第三方文件。上述配置文件中的entry里添加了第三方包vendors,其值为要分离打包的文件。运行配置后会在dist/js下生成三个独立文件:app.js、mobile.js、vendors.js。注意在页面中药引入vendors.js

    三、多重入口

    当应用有多个页面, 页面之间虽然有共享代码,但是不想在页面中加载所有代码时可以定义多重入口。例如配置文件中的app.js针对pc端页面,mobile.js仅针对移动端页面,output的filename:'js/[name].[chunkhash:8].js',采用了文件名变量,这样在dist/js中可生成与源文件同名的文件。

    四、优化缓存及懒加载

    在生产环境中,将输出文件名添加hash值,目的是在文件更改时强制客户端重新加载这个文件,而未改变的文件继续使用缓存文件。常用的有hash和chunkhash。配置文件中的[chunkhash:8]即截取8位chunkhash值。

    webpack的编译理念:webpack将style视为js的一部分,所以在计算chunkhash时,会把所有的js代码和style代码混合在一起计算。比如entry.js引用了main.css:

    import 'main.css';

    alert('I am main.js');

    webpack计算chunkhash时,以entry.js文件为编译入口,整个chunk的内容会将main.css的内容也计算在内。所以,不论是修改了js代码还是css代码,整个chunk的内容都改变了,计算所得的chunkhash随之改变。但理想情况下是想css或js内容改变时仅影响自身文件的chunkhash,这样客户端只需更新一部分文件。解决此问题首先要将css单独编译输出文件,因为正常情况下webpack会把js文件中引入的css文件编译输出到html页面的标签中。

    1.使用extract-text-webpack-plugin单独编译输出css文件

    安装extract-text-webpack-plugin,

    npm install extract-text-webpack-plugin --save-dev

    然后在配置文件中引入插件,

    //webpack.production.config.js

    var ExtractTextPlugin = require('extract-text-webpack-plugin');

    该插件除了chunkhash还提供了另外一种hash值contenthash。顾名思义,contenthash代表的是文本文件内容的hash值,也就是只有style文件的hash值。此hash是可解决上述问题的关键所在。上述配置文件使用了contenthash:

    //webpack.production.config.js

    new ExtractTextPlugin("css/[name].[contenthash:8].css"),//设置其路径(路径相对于path)

    2.使用使用webpack-md5-hash解耦css和js文件hash值

    再考虑以下情况,只修改了main.css文件,未修改entry.js文件,编译输出的js文件hash是否改变?答案是改变了,因为上文提到的webpack的编译理念,webpack将style视为js的一部分,所以在计算chunkhash时,会把所有的js代码和style代码混合在一起计算。解决办法是使用webpack-md5-hash插件:

    //webpack.production.config.js

    var WebpackMd5Hash = require('webpack-md5-hash');

    ...

    new WebpackMd5Hash();

    它的作用是生成具有独立hash值的css和js文件,即css和js文件hash值解耦。webpack-md5-hash插件对chunk-hash钩子进行捕获并重新计算chunkhash,它的计算方法是只计算模块本身的当前内容(包括同步模块)。

    3.主文件使用hash代替chunkhash解决异步加载模块改变时主文件hash不改变

    假如文件中引入了异步模块,异步模块修改后会影响编译输出的js文件的chunkhash吗?现在入口文件中引入异步模块a.js,a.js文件又异步引入b.js,b.js同步引入c模块

    //entry.js

    'use strict';

    import './saveCarInfo.js';

    window.onload = function(){//懒加载

    require.ensure(['./a.js'],function(require){

    var moduleA = require('./a.js');

    },'a');

    };

    //a.js

    'use strict'

    console.log("a");

    setTimeout(function(){

    require.ensure([],function(require){

    require('./b.js');

    },'b');

    },10000);

    module.exports = "moduleA";

    //b.js

    import fn_c from './c.js';

    console.log('b');

    module.exports = 'moduleB';

    //c.js

    console.log("c");

    module.exports = "moduleC";

    运行npm run deploy,编译输出如下,我们看到除了入口文件、css文件、html文件被输出外,异步加载的模块a.js、b.js也被当做独立模块输出。

    此时修改a.js文件中的代码,经编译后,a.[chunkhash].js的chunkhash会改变,而生成的主文件app.[chunkhash].js的chunkhash值并没有改变。原因是webpack-md5-hash的这种计算方式把异步模块的内容忽略掉了,这会造成一个问题:异步模块的修改并未影响主文件的chunkhash值。解决办法是将输出的主文件采用[hash],而非[chunkhash]

    output:{

    path:path.resolve(__dirname, 'dist'),

    publicPath:'../',//生成的html里的引用路径用 publicPath

    filename: 'js/[name].[hash:8].js',

    //异步加载的模块是要以文件形式加载,生成的文件名是以chunkFilename配置的

    chunkFilename: 'js/[name].[chunkhash:8].js'

    },

    这种做法也存在缺陷,如果项目中存在不止一个主js文件,修改任意js代码会影响所有最终主文件的[hash]值。例如上面的项目配置中会生成两个带[hash]的主文件:app.[hash].js, mobile.[hash].js。无论是修改entry.js代码还是异步模块a.js,或b.js的代码,app.[hash].js和mobile.[hash].js的[hash]都会改变。

    补充:npm提供了webpack-split-hash插件代替webpack-md5-hash,该插件可以获取到各异步模块的hash值,然后将这些hash值与主文件的代码内容一同作为计算hash的参数,这样就能保证主文件的hash值会跟随异步模块的修改而修改。但我验证后没有实现。。。

    4.使用html-webpack-plugin动态生成html

    配置文件中的输出文件都带了[chunkhash]作为版本号,在style或js文件改变时,其值都会随之改变。利用html-webpack-plugin在webpack完成前端资源打包以后,自动将打包后的资源路径和版本号写入HTML中,达到自动化的效果。

    //webpack.production.config.js

    var HtmlWebpackPlugin = require('html-webpack-plugin');

    ...

    var config = {

    ...

    plugins:[

    ...

    new HtmlWebpackPlugin({

    filename:'view/index.html', //生成的html存放路径,相对于 path

    template:'src/view/index.html', //html模板路径

    inject:true, //允许插件修改哪些内容,true/'head'/'body'/false,

    chunks:['vendors','app'],//加载指定模块中的文件,否则页面会加载所有文件

    hash:false, //为静态资源生成hash值

    minify:{ //压缩HTML文件

    removeComments:false, //移除HTML中的注释

    collapseWhitespace:false //删除空白符与换行符

    }

    }),

    new HtmlWebpackPlugin({

    filename:'view/mobile.html', //生成的html存放路径,相对于 path

    template:'src/view/mobile.html', //html模板路径

    inject:true, //允许插件修改哪些内容,true/'head'/'body'/false,

    chunks:['vendors','mobile'],//加载指定模块中的文件,否则页面会加载所有文件

    hash:false, //为静态资源生成hash值

    minify:{ //压缩HTML文件

    removeComments:false, //移除HTML中的注释

    collapseWhitespace:false //删除空白符与换行符

    }

    })

    ]}

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • ] ``` (8)懒加载 不即时加载所有资源,而是在需要的时候才加载 - @babel/plugin-syntax-dynamic-import ``` test: /\.js$/, exclude: /node_modules/, use:[ { loader: 'babel-loader', "babelrc": false,// 不采用....
  • 在注册dll或者ocx的时候,经常会遇到这么一个问题:...请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的 .dll文件是否有问题。 找不到指定的模块还是没有能解决问题,经过长时间尝试,终于用以...
  • 所以对于用这种方式打包的项目,一般会有下面两个配置文件 webpack.config.js webpack.dll.config.js 先来看下 webpack.dll.config.js const webpack = require('webpack') const library = '[name]_lib' const path...
  • 可执行文件使用来自其他DLL的代码或数据的动作作为输入。例如当exe程序弹出一个消息框时,是通过调用User32.dll的MessageBoxA(或MessageBoxW)函数来实现的Win32 API是区分字符集的,两个版本:ANSI版本与Unicode版本...
  • 项目中用到了一个第三方依赖,体积在2MB左右,打包非常耗时,因此想用dll减小构建耗时。首先通过DllPlugin构建出来若干manifest.json及js,然后通过DllReferencePlugin引用manifest.json,最后通过add-asset-...
  • 下面是我用思维导图做的简要笔记,会分几篇文章来介绍加载项的东西。加载宏暂时不太感兴趣,用到的时候在研究分享。VBA插件学习思维导图笔记本文内容:VB6封装自定义函数为自动化加载项(Function过程)适用范围:32...
  • 程序猿小伙伴们都知道,linux系统下如果程序出现崩溃问题,通过设置可以生成core文件,然后开始一波犀利的gdb操作精准地找到问题所在,很是得心应手。那么问题来了,在windows操作系统下会有core文件在程序开小差的...
  • 请注明转载地址:http://www.cnblogs.com/arhat通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信息,同时我们使用了懒加载技术和立即执行的方式来实现了对象的...
  • 0x00 前言在之前的文章《从内存加载...这个功能不需要向硬盘写入文件,十分隐蔽。与此相似的方法还有一个是Assembly.Load,同样能够从内存中加载.NET程序集。本文将会结合三个开源工程,介绍Assembly.Load的实现方...
  • 本人虽然是个手残,却非常喜欢尝试各种音游,即使被虐到爆炸也...首先拆一下压缩包,发现是unity引擎,而且还是Assembly-CSharp.dll的方式,感觉也许会轻松不少(并不是拖出来,上dnSpy,理所当然地出错。拖进UltraEd...
  • 不要在MVC视图中放C#代码 ASP.NET MVC视图会在运行时编译而不是在编译时,因此,如果在视图中包含了太多的C#代码,那么你的代码不会编译后放到dll文件中。这样做不仅有害于软件的可测试性,还会使web应用更慢,因为...
  • 以前很,入园都一年都没写过一篇文章。突然良心发现,要养成良好的习惯,记录下自己开发中的点点滴滴,也不错!! 今天遇到了一个问题,花了一个下午才找到原因,记录下。... DLL文件根本不存在...
  • 第二章内容:前端优化(二):使用路由懒加载 本文继续前两章内容,继续讲解第三个前端优化方案:抽取第三方js。 随着项目增长,引入的第三方js也越来越大。webpack将第三方js默认打成一个包,导致该js文件越来越...
  • c# 类实例序列化反序列化json文件

    千次阅读 2017-10-01 20:02:12
    添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢。但是功能加上后也再删掉代码了,索性就采用两种方式。怎么说两种方式也比一种多不是?^_^net.json详细介绍测试之前需要...
  • 添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢。但是功能加上后也再删掉代码了,索性就采用两种方式。怎么说两种方式也比一种多不是?^_^ net.json详细介绍 1 测试之前...
  • 2021-02-04

    2021-02-04 21:43:37
    webpack 性能优化 1.开发环境性能优化 a....使用缓存(hash-chunkhash-contenthash)、tree shaking(去除无用代码)、code split、lazyloading(js文件懒加载/预加载–兼容性问题严重)、PWA:渐进式
  • 懒加载和预加载5.PWA 1.优化打包构建速度 1.修改loader处理 当处理一个文件的时候,会去匹配所有的loader,但是往往一个文件只需要一个loader处理,其他剩余的loader没必要花时间去匹配处理,此时就可以使用oneOf...
  • webpack优化配置(四)

    2021-03-14 15:54:15
    webpack性能优化 开发环境性能优化 生产环境性能优化 开发环境性能优化 优化打包构建速度 HMR 优化代码调试 source-map ...dll--------单独先打包 ...懒加载/预加载 pwa 注:打包来自同一个入口文件
  • 值得注意的地方是,C#生成的可执行文件必须是32位,否则无法正常加载DLL文件. 经常使用的函数在工程中已经定义并使用.WTOPCSVRDLL使用说明中文.doc中,介绍的是VB中WtOPCSvr的使用方法.大家可以把VB的转变成C#的.我的...
  • 路由懒加载 根据权限生成动态路由 全局数据请求拦截处理及loading 多个代理配置 抽离第三方库文件dll 项目启动步骤 安装包(这里需要使用npm进行安装,如果用cnpm或者yarn会有热更新重置的问题)npm install 开发...
  • 前几天遇到一个恶心的问题,跟同事一块解决了,在这里记录下过程。 比较,直接转他的blog: ... ...“System.IO.FileNotFoundException”类型的异常在 Google.Apis.dll 中发生,但未在...其他信息: 未能加载文件...
  • wsyscheck中文版

    2011-06-23 19:15:02
    驱动加载的情况下,Wsyscheck的删除功能已经够用了,大多数文件都可以立即删除(进程模块可以直接使用右键下带删除的各项功能),加载DLL文件删除后虽然文件仍然可见,但事实上已删除,重启后该文件消失。 文件管理...
  • Wsyscheck20080122(中文版)

    2009-12-05 07:43:12
    驱动加载的情况下,Wsyscheck的删除功能已经够用了,大多数文件都可以立即删除(进程模块可以直接使用右键下带删除的各项功能),加载DLL文件删除后虽然文件仍然可见,但事实上已删除,重启后该文件消失。 文件管理...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

dll文件懒加载