Programming

vector & list(linked list) & deque

  1. a、随机访问操作,选择vector;<br /> b、已知道存储元素的数目,则选择vector;<br /> c、需要随机插入/删除(不仅仅在两端),选择list<br /> d、**只有需要在首端**进行插入/删除操作的时候,还要兼顾随机访问效率,才选择deque,否则都选择 vector。<br /> e、需要**随机插入/删除,随机访问**,选择折中的 deque。<br /> f、当要存储的是大型负责类对象时,list要优于vector;当然这时候也可以用vector来存储指向对象的指针,<br /> 同样会取得较高的效率,但是指针的维护非常容易出错,因此不推荐使用。<br />#stl #vector #list #deque

Webpack

使用external获取外部定制内容

external 用于实现文件引用的占位符
所以虽然 external 可以实现占位,但是文件还是得通过某种方式被引进来。
如出现类似这样的情况:
库需要引入某个文件,但该文件不在当前库中,该库发布后,使用该库的项目,会提供该库需要的文件。
那此时需要以下几步:

  1. 库设置 external: ```shell external: { virtualPath: ‘xxx’ // 可设置全局变量,或引入路径 }

// config.external.set(‘virtualPath’, ‘xxx’)

// ‘commonjs xxx’ 会被编译为require引入,需要外部在该路径上提供文件 // ‘window.xxx’ 则需要外部在 window 上挂载该变量

  1. > 若不使用 external 对引入目标进行占位,webpack会尝试向该 virtualPath 路径进行文件解析,失败会直接报错
  2. 2. 使用项目处提供该 变量/文件
  3. 1. 使用 copy 复制文件到指定的 xxx 路径,供给 external 获取
  4. 2. 或在 模版 html 文件中,生成该全局变量,供给 external 获取
  5. 另:<br />html script 执行 esmodule
  6. ```shell
  7. <script type="module" src="xxx"></script>
  8. <script type="module">直接输入</script>

script 标签引入public 文件

可使用 dynamic import,但需要注意支持范围
image.png
可使用 polyfill 支持
https://github.com/uupaa/dynamic-import-polyfill/blob/master/importModule.js

  1. function toAbsoluteURL(url) {
  2. const a = document.createElement("a");
  3. a.setAttribute("href", url); // <a href="hoge.html">
  4. return a.cloneNode(false).href; // -> "http://example.com/hoge.html"
  5. }
  6. function importModule(url) {
  7. return new Promise((resolve, reject) => {
  8. const vector = "$importModule$" + Math.random().toString(32).slice(2);
  9. const script = document.createElement("script");
  10. const destructor = () => {
  11. delete window[vector];
  12. script.onerror = null;
  13. script.onload = null;
  14. script.remove();
  15. URL.revokeObjectURL(script.src);
  16. script.src = "";
  17. };
  18. script.defer = "defer";
  19. script.type = "module";
  20. script.onerror = () => {
  21. reject(new Error(`Failed to import: ${url}`));
  22. destructor();
  23. };
  24. script.onload = () => {
  25. resolve(window[vector]);
  26. destructor();
  27. };
  28. const absURL = toAbsoluteURL(url);
  29. const loader = `import * as m from "${absURL}"; window.${vector} = m;`; // export Module
  30. const blob = new Blob([loader], { type: "text/javascript" });
  31. script.src = URL.createObjectURL(blob);
  32. document.head.appendChild(script);
  33. });
  34. }
  35. importModule('./xxx.js').then(() => {})

webpack ignore

https://github.com/webpack/webpack/issues/8826
弱依赖

require.resolveWeak

webpack提供了require.resolveWeak的API来实现弱依赖打包。

  1. [
  2. // 兼容webpack,需要业务先行引入上报库
  3. () => __webpack_modules__[require.resolveWeak('a')],
  4. () => __webpack_modules__[require.resolveWeak('b')],
  5. ].some((fn, i) => {
  6. try {
  7. this.x = fn();
  8. return !!this.x;
  9. } catch (e) {
  10. console.warn('xxx');
  11. }
  12. });

这种方式的缺陷就是业务代码中必须将模块a或b先依赖进来,如果仅仅是nodemodules中存在模块,则_webpack_modules中不会有打包的模块,是一种相对较弱的optional require。

non_webpack_require

按照官方文档的说法,实际上会将源码:

  1. __non_webpack_require__('a')

生成:

  1. require('a')

以交由其他模块加载器处理,也有很大的局限性。