Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Webpack 将网页包加载程序应用于代码片段_Webpack_Webpack 2 - Fatal编程技术网

Webpack 将网页包加载程序应用于代码片段

Webpack 将网页包加载程序应用于代码片段,webpack,webpack-2,Webpack,Webpack 2,有没有办法让webpack将其加载程序应用于文件的一部分?这里有一个例子来说明我的意思 假设我为.scss文件配置了一组加载程序。如果能够用以下两种方法中的任何一种编写组件以产生相同的输出,那将是一件了不起的事情: 1)标准装载机 component.js import './component.scss'; export class Component { ... my-magic-import ` .component { background: #663399 } `

有没有办法让webpack将其加载程序应用于文件的一部分?这里有一个例子来说明我的意思

假设我为
.scss
文件配置了一组加载程序。如果能够用以下两种方法中的任何一种编写组件以产生相同的输出,那将是一件了不起的事情:


1)标准装载机

component.js

import './component.scss';

export class Component {
...
my-magic-import `
  .component {
    background: #663399
  }
`

export class Component {
...
component.scss

.component {
  background: #663399
}

...

2)定制装载机

component.js

import './component.scss';

export class Component {
...
my-magic-import `
  .component {
    background: #663399
  }
`

export class Component {
...

我怎样才能达到类似于第二种情况的效果? 我是否可以修改网页识别
所需
导入
和文件扩展名的方式,以便它能够理解我的自定义语法? 作为最后的手段,我们可以为js文件编写一个加载程序来完成这项工作吗


谢谢你给我的提示,我应该读些什么来完成这项工作。

你可以尝试使用这两个带有webpack的库先转换成cssobj,然后再转换成纯CSS

(支持sass/less)

您可以编写一个全局唯一的函数
\uu insertCSS
(在应用程序的index.js中),该函数在
head
元素中插入纯CSS字符串

现在,这些库只在节点上运行,所以您还需要一个步骤来让它在浏览器中工作:字符串替换插件

在webpack config中,您应该配置replace插件来搜索类似
/\uu insertCSS\(.*?\)/
的模式,获取字符串参数,按照上面所示的方式处理它,并用结果替换它

在您的网页包配置中:

var StringReplacePlugin = require("string-replace-webpack-plugin");
var converter = require('cssobj-converter')
var cssobj = require('cssobj')

function parseSass(str){
var obj = converter(str) //obj is a css object
return cssobj(obj) // the result is a CSS string
}
…在
模块中

    loaders: [
             // configure replacements for file patterns 
             { 
                test: /\.js(x?)$/,
                loader: StringReplacePlugin.replace({
                    replacements: [
                        {
                            pattern: /__insertCSS\(`(.*?)`\)/ig,
                            replacement: function (match, p1, offset, string) {
                               //p1 is the string enclosed by backticks
                                var cssStr =  parseSass(p1); 
                              //need to escape quotes with JSON in resulting string   
                                return '__insertCSS("' + JSON.stringify(cssStr) + '")'
                            }
                        }
                    ]})
                }
          ]
请注意,我还没有测试过这一点,但乍一看似乎是可行的

这个字符串替换加载程序必须位于babel之前,只需将它放在
加载程序
数组的第一位


这里的医生:

谢谢,今天晚些时候我一定会看一看!你使用stringreplace插件的方式对我理解另一种实现方法至关重要。非常感谢您的洞察力和帮助,非常感谢。